1

我正在尝试用 C++ 编写一个类,它提供了一种以原子方式附加到文件的方法,即使在写入过程中出现电源故障的情况下也是如此。

首先,我将我当前的文件位置(从文件开头偏移 64 字节,以字节为单位)写入一个单独的日志文件。然后,我将请求的数据写入日期文件的末尾。最后,我在日志文件上调用 ftruncate()(将截断大小设置为 0)。

主要思想是,如果曾经要求此类打开具有非空日志文件的文件,那么您知道写入被中断,您可以从日志文件中读取最后写入的位置并 fseek 到该位置。您丢失了最后的部分写入,但文件不应损坏。

不幸的是,似乎 ftruncate() 是异步的。在实践中,即使我在 ftruncate 之后调用 fflush() 和 fsync(),我也会看到日志在进行大量写入时增长到数百字节。它最终总是以 0 结束,但我希望始终看到它的大小为 0 或大小为 8。

是否可以使 ftruncate 完全同步?或者有没有更好的方法来使用期刊?

4

1 回答 1

7

ftruncate()不会更改文件描述符在文件中的写入偏移量。如果您在调用后保持文件打开并写入下一个长度ftruncate(),那么正在发生的事情是文件的偏移量仍在增加。当您写入时,它将文件的长度重置为偏移量,然后将您的字节写入那里。

可能您想要做的是lseek(fd, 0, SEEK_SET)在您调用之后调用ftruncate(),以便下一次写入文件将发生在文件的开头。

于 2012-02-06T01:26:12.673 回答