我正在使用C++ ofstream在Linux上編寫日誌文件。當我使用tail -f命令監視文件內容時,我可以看到正確填充了內容。但是如果發生停電並且在重新上電後再次檢查文件,則最後幾行記錄消失。使用hexdump我可以將這些記錄轉換爲空字符'\ 0'。我嘗試了flush()和manipulator std :: endl,但它們無論如何都沒有幫助。斷電後文件內容丟失
這是真的,尾巴顯示給我的是沒有真正寫入磁盤,他們只是在緩衝區? inode表在停電之前沒有更新?我可以接受這個事實,但我不明白爲什麼記錄轉換爲空字符,如果他們沒有寫入文件。
順便說一句,我試過谷歌的glog,並有相同的結果(一堆空字符在最後)。我也試過zlog,一個C庫。並發現它只丟失了最後的記錄,但沒有用空字符替換它們。
使用同步而不是刷新。可能的重複http://stackoverflow.com/questions/14251873/what-is-the-difference-between-flush-and-sync-in-regard-to-fstream-buffers –
純粹假設的解釋:「尾巴」顯示操作系統緩存的內容或磁盤控制器的緩衝區。該文件已被擴展(帶有零),內容(可能)已被寫入磁盤控制器的緩衝區,但控制器尚未將其緩衝區寫入磁盤。 – molbdnilo
@molbdnilo我認爲您建議立即更新文件系統以反映文件的新大小,但數據從未有機會被磁盤控制器寫入磁盤。然後誰決定實際寫入數據,OS?磁盤控制器固件? –