C 是否每个进程都将其标准DIN标准定义为键盘、终端等?

C 是否每个进程都将其标准DIN标准定义为键盘、终端等?,c,process,C,Process,每个进程是否都有与键盘和终端关联的stdin、stdout和stderr 我有一个小程序。我想将键盘输入替换为名为new.txt的文件。我该怎么做呢 FILE *file1 fopen("new.txt", "r") close(0); // close the stdio dup2(file1, 0); 这样行吗?现在我的stdio被重定向到文件?不,不是每个进程。但在提供命令行窗口输入的操作系统上,从该命令行启动的程序将把stdin连接到键盘,stdout和stderr都连接到终端 如果

每个进程是否都有与键盘和终端关联的
stdin
stdout
stderr

我有一个小程序。我想将键盘输入替换为名为
new.txt
的文件。我该怎么做呢

FILE *file1
fopen("new.txt", "r")
close(0);  // close the stdio
dup2(file1, 0);
这样行吗?现在我的
stdio
被重定向到
文件

不,不是每个进程。但在提供命令行窗口输入的操作系统上,从该命令行启动的程序将把stdin连接到键盘,stdout和stderr都连接到终端

如果一个程序启动另一个程序,则通常第二个程序的标准流以某种方式连接到第一个程序;例如,第一个程序可能有一个开放描述符,通过它可以发送文本,并假装它是第二个进程的“键盘”。当然,详细信息因操作系统而异。

不,不是每个进程都有。但在提供命令行窗口输入的操作系统上,从该命令行启动的程序将把stdin连接到键盘,stdout和stderr都连接到终端


如果一个程序启动另一个程序,则通常第二个程序的标准流以某种方式连接到第一个程序;例如,第一个程序可能有一个开放描述符,通过它可以发送文本,并假装它是第二个进程的“键盘”。当然,详细信息因操作系统而异。

回答您的问题:

这样行吗

否。
dup2()
在传递
文件*
int
时,接受两个文件描述符(
int
s)。您不能像这样混合使用文件句柄(
file*
s)和文件描述符(
int
s)

可以使用
open
而不是
fopen
将文件作为文件描述符而不是文件句柄打开,也可以使用
fileno
从文件句柄获取文件描述符。或者可以使用
freopen
重新打开新文件的
stdin
文件句柄


请注意,文件描述符(
int
s)是POSIX操作系统的一部分,只能移植到其他POSIX系统,而文件句柄(
file*
s)是C标准的一部分,可以移植到任何地方。如果使用文件描述符,则必须重写代码以使其在Windows上工作。

回答您的问题:

这样行吗

否。
dup2()
在传递
文件*
int
时,接受两个文件描述符(
int
s)。您不能像这样混合使用文件句柄(
file*
s)和文件描述符(
int
s)

可以使用
open
而不是
fopen
将文件作为文件描述符而不是文件句柄打开,也可以使用
fileno
从文件句柄获取文件描述符。或者可以使用
freopen
重新打开新文件的
stdin
文件句柄

请注意,文件描述符(
int
s)是POSIX操作系统的一部分,只能移植到其他POSIX系统,而文件句柄(
file*
s)是C标准的一部分,可以移植到任何地方。如果使用文件描述符,则必须重写代码才能在Windows上工作