LINUX - 文件讀寫緩存

 

 

遇到一個進程core掉後日志打印不出來的問題;html

參考以下:函數

【引用】spa

只有正常退出,才能作到flush。不然將寫失敗。調試

以後有百度了下中文資料,發現一樣的結論。日誌

「fflush庫函數的做用是把文件流裏的全部未寫出數據馬上寫出。例如,你能夠用這個函數來確保在試圖讀入一個用戶響應以前,先向終端送出一個交互提示符。使用這個函數還能夠確保在程序繼續執行以前重要的數據都已經被寫到磁盤上。有時在調試程序時,還能夠用它來肯定程序是正在寫數據而不是被掛起了。注意,調用fclose函數隱含執行了一次flush操做,因此沒必要在fclose以前調用fflush。htm

fclose庫函數關閉指定的文件流stream,使全部還沒有寫出的數據都寫出。由於stdio庫會對數據進行緩衝,因此使用fclose是很重要的。若是程序須要確保數據已經所有寫出,就應該調用fclose函數。雖然當程序正常結束時,會自動對全部還打開的文件流調用fclose函數,但這樣作就沒有機會檢查由fclose報告的錯誤了。與文件描述符同樣,可用文件流的數目也是有限制的。這個限制由頭文件stdio.h中的FOPEN_MAX常量定義,最小爲8。」blog

「所謂flush一個緩衝,是指對寫緩衝而言,將緩衝內的數據所有寫入實際的文件,並將緩衝清空,這樣能夠保證文件處於最新的狀態。之因此須要flush,是由於寫緩衝使得文件處於一種不一樣步的狀態,邏輯上一些數據已經寫入了文件,但實際上這些數據仍然在緩衝中,若是此時程序意外地退出(發生異常或斷電等),那麼緩衝裏的數據將沒有機會寫入文件。flush能夠在必定程度上避免這樣的狀況發生。」進程

因此說,平時咱寫程序,須要謹慎和按流程來,fclose作的事情有不少,不要全期望main函數return後自動幫你close文件。由於一旦出現上述中斷的情形,就會生問題。get

 

解決方案:同步

分析了這麼多,解決方案相比也很明瞭了。

方案一:

在C程序中加入SIGINT響應函數,保證程序正常退出。

方案二:

在C程序中加入fflush函數,保證全部輸出第一時間寫入文件。

 

方案一纔是最好的解決方案,而方案二有些hack了。

就這樣。

 

 

引用地址:

https://www.cnblogs.com/ShaneZhang/p/4438066.html

相關文章
相關標籤/搜索