每个流程是否都有stdin
,stdout
和stderr
与键盘和终端相关联?
我有一个小程序。我想将键盘输入替换为名为new.txt
的文件。我该怎么办呢?
FILE *file1
fopen("new.txt", "r")
close(0); // close the stdio
dup2(file1, 0);
这会有用吗?现在我的stdio
被重定向到FILE
?
答案 0 :(得分:4)
不,不是每个进程。但是在为您提供输入命令行窗口的操作系统上,从该命令行启动的程序将stdin连接到键盘,stdout和stderr都将进入终端。
如果一个程序启动另一个程序,那么第二个程序的标准流通常以某种方式连接到第一个程序;例如,第一个程序可能有一个打开的描述符,通过它可以发送文本并假装它是第二个进程的“键盘”。当然,细节因操作系统而异。
答案 1 :(得分:1)
回答你的问题:
这会有用吗?
没有。 dup2()
在传递int
和FILE *
时会占用两个文件描述符(int
s)。你不能混合文件句柄(FILE *
s)和文件描述符(int
s)。
您可以使用open
代替fopen
将文件作为文件描述符而不是文件句柄打开,或者您可以使用fileno
从文件句柄中获取文件描述符。或者您可以使用freopen
重新打开stdin
文件句柄到新文件。
请注意,文件描述符(int
s)是POSIX操作系统的一部分,只能移植到其他POSIX系统,而文件句柄(FILE *
s)是C标准的一部分,可移植到处。如果使用文件描述符,则必须重写代码才能使其在Windows上运行。