在定位乙個問題的時候發現「用命令列重定向程式的輸出log到乙個檔案」的時候,檔案裡沒有任何列印。
之前在定位同乙個程式的「非預期退出」問題時明明有列印的。
調查後發現這是檔案緩衝帶來的影響。這種問題在以前的才坑歷程中遇到過,只是忘記了,現在再次回想起來,於是就記錄一下。
標準輸出是有緩衝的(標準錯誤沒有),緩衝分為三種:
輸出到螢幕、終端的時候,標準輸出是行緩衝。輸出到檔案時,標準輸出是全緩衝。之前解決這種輸出到檔案的log的問題時,就是採用「另起乙個執行緒定期fflush」的方式來解決log輸出不及時的問題的。
查閱了一下資料,除了fflush之外,還有兩種方法解決此問題:
1.c標準庫中的setvbuf函式(stdio.h)
setvbuf(stdout, null, _iolbf, 0);
2.linux命令stdbuf
stdbuf -ol ./program > log.txt //設定成行緩衝
但是這兩種方式也各存在缺陷。第一種,對於printf的程式,需要改變**結構,調查起來不方便;第二種,對於嵌入式環境,目標板上很可能沒有stdbuf這個命令。
我想應該還有乙個方法,就是通過對linux的某個系統檔案進行設定來達到目的,但是目前還沒有調查清楚。
關於緩衝和重定向的問題
先觀察以下程式 將標準輸入的資料複製到標準輸出 include int main void 以上程式並不是每讀入乙個字元後就馬上輸出,而是在按下回車鍵後一併輸出.c語言的輸入輸出一般會將讀入的字元以及帶輸出的字元暫時儲存在快取中,當達到下列條件時才進行實際的輸入輸出操作.當然,也有下面這樣的環境 這...
Cout重定向到檔案
cout預設是與監視器 螢幕 相連,cout出來的內容會輸出到螢幕上,通常是會在命令列視窗之中。但有時,我們希望將cout出來的具體日誌 錯誤資訊寫到某個檔案之中,而螢幕上僅僅顯示出當前進行的任務,以及程式執行狀態等資訊。我們可以使用下面重定向的方式來實現 cpp view plain copy i...
重定向stdout到檔案
把stdout重定向到檔案 兩種方法 第一種方法沒有恢復 通過freopen把stdout重新開啟到檔案 include file stream void main void fprintf stdout,this is not print out n 這裡沒有輸出 system ls 沒有會造成問...