我寫了一個程序,其capture
輸出標準輸出消息以及標準錯誤消息(即,printf()的,fprintf中(錯誤,..))輸出重定向是否按順序寫stdout和stderr信息?
,我想在終端被顯示在打印信息以及保存進入日誌文件。
./capture 2>&1|tee log
但我看到stdout和stderr消息似乎沒有按順序在日誌文件中。
確實輸出重定向寫入stdout和stderr信息的順序?如果不是,我可以做些什麼來使他們按順序?
我寫了一個程序,其capture
輸出標準輸出消息以及標準錯誤消息(即,printf()的,fprintf中(錯誤,..))輸出重定向是否按順序寫stdout和stderr信息?
,我想在終端被顯示在打印信息以及保存進入日誌文件。
./capture 2>&1|tee log
但我看到stdout和stderr消息似乎沒有按順序在日誌文件中。
確實輸出重定向寫入stdout和stderr信息的順序?如果不是,我可以做些什麼來使他們按順序?
輸出重定向,因爲它保持您的write()
調用的順序。重定向僅更改爲進程保留的內核中的文件描述符結構,將fd1
下的值複製到fd2
。
你的問題是,*printf()
緩衝輸出批處理一些write()
調用。對於stdout
,通常不使用stderr
和line-buffering
的緩衝。但是,當您將其重定向到管道時,它會切換到block
緩衝stdout
,延遲輸出(請參閱man stdout
)。在開始時將緩衝模式手動設置爲setlinebuf(stdout);
,或者在每個*printf()
之後使用fflush(stdout);
。或者只是使用原始write()
調用。你可以在man setlinebuf
閱讀。
在bash中,您實際上也可以使用|&
進行重定向。查看man bash
約Pipelines
。