我正在嘗試在C++中編寫一個類,它提供了一種原子追加到文件的方法,即使在停電中寫入的情況下也是如此。首先,我將當前文件位置(距離文件開頭的64個偏移量,以字節爲單位)寫入單獨的日誌文件。然後,我將請求的數據寫入日期文件的末尾。最後,我在日誌文件中調用ftruncate()(將截斷大小設置爲0)。ftruncate()是異步的嗎?
主要思想是,如果這個類有人要求打開一個非空的日誌文件的文件,那麼你知道一個寫入被中斷,你可以從日誌文件和fseek讀取最後寫入的位置到那個地方。你失去了最後的部分寫入,但該文件不應該被損壞。
不幸的是,似乎ftruncate()是異步的。實際上,即使我在ftruncate之後調用fflush()和fsync(),我也會看到日誌在進行大量寫操作時增長到高達數百個字節。它總是最終以0結束,但我期望在任何時候都能看到0或8的大小。
是否有可能使ftruncate完全同步?或者有更好的方式來使用期刊?
呃電源故障? – 2012-02-06 00:57:18
如果在恢復日誌期間再次斷電,該怎麼辦? – 2012-02-06 00:59:24
「有沒有更好的方式來使用期刊?」 - 取決於您的恢復要求。在你的數據文件中寫入一些「下一塊應該是N字節」的消息將避免需要單獨的日誌(並且頭部重新定位在磁性HDD上很慢),假設在恢復情況下你有時間從開始重新掃描文件 - 沿着塊跳轉,或者當從文件末尾向後掃描時,可以將這種下一塊N字節內容與其他內容區分開。內存映射對日記來說可能更優雅一些。 – 2012-02-06 01:43:44