每個進程是否有與其關聯的鍵盤和終端的stdin
,stdout
和stderr
?每個進程是否有stdin stdout stderr定義爲鍵盤,終端等?
我有一個小程序。我想將鍵盤輸入替換爲名爲new.txt
的文件。我該如何解決它?
FILE *file1
fopen("new.txt", "r")
close(0); // close the stdio
dup2(file1, 0);
這項工作?現在我的stdio
被重定向到FILE
?
每個進程是否有與其關聯的鍵盤和終端的stdin
,stdout
和stderr
?每個進程是否有stdin stdout stderr定義爲鍵盤,終端等?
我有一個小程序。我想將鍵盤輸入替換爲名爲new.txt
的文件。我該如何解決它?
FILE *file1
fopen("new.txt", "r")
close(0); // close the stdio
dup2(file1, 0);
這項工作?現在我的stdio
被重定向到FILE
?
不,不是每過程。但在給你一個命令行窗口輸入的操作系統上,從該命令行啓動的程序將把stdin連接到鍵盤,stdout和stderr都會到達終端。
如果一個程序開始另一個程序,那麼通常第二個程序的標準流以某種方式連接到第一個程序;例如,第一個程序可能有一個開放的描述符,通過它可以發送文本並假裝它是第二個進程的「鍵盤」。當然,細節因操作系統而異。
在回答你的問題:
將這項工作?
號dup2()
佔2個文件描述符(int
S),當你傳遞一個FILE *
和int
。您不能混合文件句柄(FILE *
s)和文件描述符(int
s)那樣。
你可以使用的open
代替fopen
打開你的文件作爲文件描述符,而不是文件句柄,或者你可以使用fileno
從文件句柄獲取文件的描述符。或者您可以使用freopen
將stdin
文件句柄重新打開到新文件。
注意,文件描述符(int
S)是POSIX操作系統的一部分,只是移植到其他POSIX系統,而文件句柄(FILE *
S)是C標準的一部分,是便攜式無處不在。如果使用文件描述符,則必須重寫代碼才能使其在Windows上工作。