2015-10-14 107 views
1

我寫了一個程序,其capture輸出標準輸出消息以及標準錯誤消息(即,printf()的,fprintf中(錯誤,..))輸出重定向是否按順序寫stdout和stderr信息?

,我想在終端被顯示在打印信息以及保存進入日誌文件。

./capture 2>&1|tee log 

但我看到stdout和stderr消息似乎沒有按順序在日誌文件中。

確實輸出重定向寫入stdout和stderr信息的順序?如果不是,我可以做些什麼來使他們按順序?

回答

0

輸出重定向,因爲它保持您的write()調用的順序。重定向僅更改爲進程保留的內核中的文件描述符結構,將fd1下的值複製到fd2

你的問題是,*printf()緩衝輸出批處理一些write()調用。對於stdout,通常不使用stderrline-buffering的緩衝。但是,當您將其重定向到管道時,它會切換到block緩衝stdout,延遲輸出(請參閱man stdout)。在開始時將緩衝模式手動設置爲setlinebuf(stdout);,或者在每個*printf()之後使用fflush(stdout);。或者只是使用原始write()調用。你可以在man setlinebuf閱讀。

在bash中,您實際上也可以使用|&進行重定向。查看man bashPipelines