我有一個程序。在這個程序中,我有一個http會話與其他設備。在程序中我有很多printf
。當我通過fclose(stdout)
關閉stdout
時,我注意到由printf
打印的消息被髮送到http會話(包含在http數據包中的消息)。關閉標準輸出時的奇怪行爲
我想知道這個奇怪的行爲,我想知道如何避免這種行爲?我的意思是如何避免將打印的消息重定向到http會話?
我有一個程序。在這個程序中,我有一個http會話與其他設備。在程序中我有很多printf
。當我通過fclose(stdout)
關閉stdout
時,我注意到由printf
打印的消息被髮送到http會話(包含在http數據包中的消息)。關閉標準輸出時的奇怪行爲
我想知道這個奇怪的行爲,我想知道如何避免這種行爲?我的意思是如何避免將打印的消息重定向到http會話?
發生了什麼事情是,您正在關閉stdout使用的文件描述符,並且下一個創建的文件描述符(在本例中爲套接字)結束於傳統使用的文件描述符(FD 1)。
不要關閉標準輸出。如果你需要把它趕走,與文件描述符替換它指出/dev/null
,e.g:
freopen("/dev/null", "w", stdout);
調用printf
fclose(stdout)
後調用未定義的行爲。不要這樣做。如果您只需要禁止stdout
,請將/ dev/null和dup2
打開到fd#1。
標準輸出可能因事故而關閉。例如關閉用於啓動我的應用程序的ssh會話。如果另一個用戶更改了IP地址,ssh會話可能會被accidentelly關閉。在這種情況下我必須做什麼? – MOHAMED 2013-02-21 07:31:28
不,不可以。斷開和關閉完全不同。 – 2013-02-21 13:17:07
'freopen'不需要重複使用相同的fd號碼,因此如果某些代碼通過fd而不是stdio寫入stdour,則可能會導致嚴重問題。 – 2013-02-20 20:40:27
該文檔指出:「freopen()函數的主要用途是更改與標準文本流(stderr,stdin或stdout)關聯的文件。」所以如果它不保留相同的FD,我會很驚訝。 (實際上,它確實如此。) – duskwuff 2013-02-20 21:03:35
標準輸出可能因事故而關閉。例如關閉用於啓動我的應用程序的ssh會話。如果另一個用戶更改了IP地址,ssh會話可能會被accidentelly關閉。在這種情況下我必須做什麼? – MOHAMED 2013-02-21 07:31:47