是否每个进程都将其stdin stdout stderr定义为键盘,终端等?

时间:2011-03-16 02:05:47

标签: c process

每个流程是否都有stdinstdoutstderr与键盘和终端相关联?

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

FILE *file1
fopen("new.txt", "r")
close(0);  // close the stdio
dup2(file1, 0);

这会有用吗?现在我的stdio被重定向到FILE

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

回答你的问题:

  

这会有用吗?

没有。 dup2()在传递intFILE *时会占用两个文件描述符(int s)。你不能混合文件句柄FILE * s)和文件描述符int s)。

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

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