最近遇到個問題,程序直接運行時,可以及時刷新printf的輸出,但當重定向到log文件時,存在一個3分鐘左右的延遲。問題出在printf涉及到緩衝機制上,緩衝區會在以下5種情況下刷新:
- 使用fflush(stdout)強制刷新標準輸出緩衝區
- 緩衝區已滿
- scanf()要在緩衝區裏取數據時會先將緩衝區刷新
- \n進入緩衝區時
- 程序結束時
一般stdout是行緩衝機制,遇到\n就刷新緩衝區,如果將輸出重定向到文件,那麼\n不會刷新,得等到緩衝區滿才刷新,這時候就會出現log延遲的問題。怎麼辦呢?其實也好辦,可以通過以下方法解決:
- setvbuf(stdout,NULL,_IONBF,0); 在整個項目中禁止緩存的功能
- fflush(stdout); 在需要強制刷新緩存時,調用fflush一次性刷新緩衝區
- stderr是無緩衝機制,不用經過fflush或exit,就直接打印出來。可以用來替換stdout輸出warning或者error,及時提醒運維人員處理可能的系統異常。