![](/img/trans.png)
[英]How to create create subprocess with a FILE* as its stdin, stdout or stderr?
[英]Does every process have its stdin stdout stderr defined as Keyboard, Terminal etc?
每個進程都將與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()
在傳遞FILE *
和int
會使用兩個文件描述符( int
)。 您不能像這樣混合使用文件句柄 ( FILE *
s)和文件描述符 ( int
s)。
您可以使用open
而不是fopen
來打開文件作為文件描述符而不是文件句柄,或者可以使用fileno
從文件句柄獲取文件描述符。 或者,您可以使用freopen
將stdin
文件句柄重新打開到新文件。
請注意,文件描述符( int
)是POSIX操作系統的一部分,並且只能移植到其他POSIX系統中,而文件句柄( FILE *
s)是C標准的一部分,可以在任何地方移植。 如果使用文件描述符,則必須重寫代碼才能使其在Windows上運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.