簡體   English   中英

是否每個進程都將其stdin stdout stderr定義為Keyboard,Terminal等?

[英]Does every process have its stdin stdout stderr defined as Keyboard, Terminal etc?

每個進程都將與stdinstdoutstderr關聯到鍵盤和終端嗎?

我有一個小程序。 我想將鍵盤輸入替換為一個名為new.txt的文件。 我該怎么辦?

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

這行得通嗎? 現在我的stdio重定向到FILE嗎?

不,不是每個過程。 但是在為您提供命令行窗口輸入的操作系統上,從該命令行啟動的程序會將stdin連接到鍵盤,而stdout和stderr都將連接到終端。

如果一個程序啟動另一個程序,那么第二個程序的標准流通常以某種方式連接到第一個程序。 例如,第一個程序可能具有打開的描述符,通過它可以發送文本並假裝它是第二個進程的“鍵盤”。 當然,具體細節因操作系統而異。

針對您的問題:

這行得通嗎?

dup2()在傳遞FILE *int會使用兩個文件描述符( int )。 您不能像這樣混合使用文件句柄FILE * s)和文件描述符int s)。

您可以使用open而不是fopen來打開文件作為文件描述符而不是文件句柄,或者可以使用fileno從文件句柄獲取文件描述符。 或者,您可以使用freopenstdin文件句柄重新打開到新文件。

請注意,文件描述符( int )是POSIX操作系統的一部分,並且只能移植到其他POSIX系統中,而文件句柄( FILE * s)是C標准的一部分,可以在任何地方移植。 如果使用文件描述符,則必須重寫代碼才能使其在Windows上運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM