2013-02-27 49 views
0

我正在嘗試將stdout重定向到套接字。我做這樣的事情:將stdout重定向到套接字

dup2(new_fd, STDOUT_FILENO); 

這樣做畢竟stdio功能寫入標準輸出失敗。我試圖重新打開標準輸出是這樣的:

fclose(stdout); 
stdout = fdopen(STDOUT_FILENO, "wb"); 

printf等功能仍然不工作。

編輯:

我affraid,我誤解了問題擺在首位。經過一些調試後,我發現這是一個真正的問題:

printf("Test"); // We get Broken pipe here 
// Reconnect new_fd 
dup2(new_fd, STDERR_FILENO); 
printf("Test"); // This also returns Broken pipe despite that stdout is fine now 

謝謝。

+0

'fdopen'只包裝現有的文件描述符。當你調用'fclose'時,你關閉'stdout'並刪除fd 1作爲一個有效的文件描述符。 – Michael 2013-02-27 01:59:26

+0

即使沒有'fclose',它也不起作用。在執行'dup2' printf失敗後,我仍然可以將'write()'寫入'STDOUT_FILENO'。 – 2013-02-27 02:06:20

+0

因爲您在'STDOUT_FILENO'上覆制了'new_fd',您需要關閉它並重新打開。你在做什麼操作系統? – Michael 2013-02-27 02:09:06

回答

1

我已經清除標準輸入輸出的故障指示燈解決了這個問題:

clearerr(stdout); 

感謝你的幫助。

1

1:dup2(src, dst)

一些操作系統通過使用文件描述符跟蹤打開的文件。 dup2內部將文件描述符從src複製到dst,如果它已經打開,則關閉dst

你的第一個陳述正在做什麼是使每個寫入STDOUT_FILENOnew_fd代表的對象。我說對象,因爲它可能是一個套接字以及一個文件。

我沒有看到你的第一行代碼有什麼問題,但我不知道如何定義new_fd

2:開張大吉stdout

當您關閉文件描述符,操作系統從表中刪除。但是,當您打開文件描述符時,操作系統會將最小的可用文件描述符設置爲返回的值。因此,要重新打開stdout,您只需重新打開設備即可。我相信設備會根據操作系統而變化。例如,在我的Mac上,設備是/dev/tty

因此,要重新打開標準輸出,要做到以下幾點:固定stdout

close(1); 
open("/dev/tty", O_WRONLY); 
+1

對不起,我沒有關注。我不想重新打開標準輸出。我想將stdout重定向到套接字。 – 2013-02-27 13:08:36

相關問題