我正在尝试用 C++ 编写一个类,它提供了一种以原子方式附加到文件的方法,即使在写入过程中出现电源故障的情况下也是如此。
首先,我将我当前的文件位置(从文件开头偏移 64 字节,以字节为单位)写入一个单独的日志文件。然后,我将请求的数据写入日期文件的末尾。最后,我在日志文件上调用 ftruncate()(将截断大小设置为 0)。
主要思想是,如果曾经要求此类打开具有非空日志文件的文件,那么您知道写入被中断,您可以从日志文件中读取最后写入的位置并 fseek 到该位置。您丢失了最后的部分写入,但文件不应损坏。
不幸的是,似乎 ftruncate() 是异步的。在实践中,即使我在 ftruncate 之后调用 fflush() 和 fsync(),我也会看到日志在进行大量写入时增长到数百字节。它最终总是以 0 结束,但我希望始终看到它的大小为 0 或大小为 8。
是否可以使 ftruncate 完全同步?或者有没有更好的方法来使用期刊?