2013-02-20 38 views
0

我有一個程序。在這個程序中,我有一個http會話與其他設備。在程序中我有很多printf。當我通過fclose(stdout)關閉stdout時,我注意到由printf打印的消息被髮送到http會話(包含在http數據包中的消息)。關閉標準輸出時的奇怪行爲

我想知道這個奇怪的行爲,我想知道如何避免這種行爲?我的意思是如何避免將打印的消息重定向到http會話?

回答

2

發生了什麼事情是,您正在關閉stdout使用的文件描述符,並且下一個創建的文件描述符(在本例中爲套接字)結束於傳統使用的文件描述符(FD 1)。

不要關閉標準輸出。如果你需要把它趕走,與文件描述符替換它指出/dev/null,e.g:

freopen("/dev/null", "w", stdout); 
+0

'freopen'不需要重複使用相同的fd號碼,因此如果某些代碼通過fd而不是stdio寫入stdour,則可能會導致嚴重問題。 – 2013-02-20 20:40:27

+0

該文檔指出:「freopen()函數的主要用途是更改與標準文本流(stderr,stdin或stdout)關聯的文件。」所以如果它不保留相同的FD,我會很驚訝。 (實際上,它確實如此。) – duskwuff 2013-02-20 21:03:35

+0

標準輸出可能因事故而關閉。例如關閉用於啓動我的應用程序的ssh會話。如果另一個用戶更改了IP地址,ssh會話可能會被accidentelly關閉。在這種情況下我必須做什麼? – MOHAMED 2013-02-21 07:31:47

3

調用printffclose(stdout)後調用未定義的行爲。不要這樣做。如果您只需要禁止stdout,請將/ dev/null和dup2打開到fd#1。

+0

標準輸出可能因事故而關閉。例如關閉用於啓動我的應用程序的ssh會話。如果另一個用戶更改了IP地址,ssh會話可能會被accidentelly關閉。在這種情況下我必須做什麼? – MOHAMED 2013-02-21 07:31:28

+0

不,不可以。斷開和關閉完全不同。 – 2013-02-21 13:17:07