遇到一個進程core掉后日志打印不出來的問題;
參考如下:
【引用】
只有正常退出,才能做到flush。否則將寫失敗。
之后有百度了下中文資料,發現同樣的結論。
“fflush庫函數的作用是把文件流里的所有未寫出數據立刻寫出。例如,你可以用這個函數來確保在試圖讀入一個用戶響應之前,先向終端送出一個交互提示符。使用這個函數還可以確保在程序繼續執行之前重要的數據都已經被寫到磁盤上。有時在調試程序時,還可以用它來確定程序是正在寫數據而不是被掛起了。注意,調用fclose函數隱含執行了一次flush操作,所以不必在fclose之前調用fflush。
fclose庫函數關閉指定的文件流stream,使所有尚未寫出的數據都寫出。因為stdio庫會對數據進行緩沖,所以使用fclose是很重要的。如果程序需要確保數據已經全部寫出,就應該調用fclose函數。雖然當程序正常結束時,會自動對所有還打開的文件流調用fclose函數,但這樣做就沒有機會檢查由fclose報告的錯誤了。與文件描述符一樣,可用文件流的數目也是有限制的。這個限制由頭文件stdio.h中的FOPEN_MAX常量定義,最小為8。”
“所謂flush一個緩沖,是指對寫緩沖而言,將緩沖內的數據全部寫入實際的文件,並將緩沖清空,這樣可以保證文件處於最新的狀態。之所以需要flush,是因為寫緩沖使得文件處於一種不同步的狀態,邏輯上一些數據已經寫入了文件,但實際上這些數據仍然在緩沖中,如果此時程序意外地退出(發生異常或斷電等),那么緩沖里的數據將沒有機會寫入文件。flush可以在一定程度上避免這樣的情況發生。”
所以說,平時咱寫程序,需要謹慎和按流程來,fclose做的事情有很多,不要全指望main函數return后自動幫你close文件。因為一旦出現上述中斷的情形,就會生問題。
解決方案:
分析了這么多,解決方案相比也很明了了。
方案一:
在C程序中加入SIGINT響應函數,保證程序正常退出。
方案二:
在C程序中加入fflush函數,保證所有輸出第一時間寫入文件。
方案一才是最好的解決方案,而方案二有些hack了。
就這樣。
引用地址: