我正在尝试用 C++ 编写一个类,它提供一种原子追加到文件的方法,即使在写入过程中出现电源故障的情况下也是如此。
首先,我将当前文件位置(从文件开头开始的 64 位偏移量,以字节为单位)写入一个单独的日志文件。然后,我将请求的数据写入日期文件的末尾。最后,我在日志文件上调用 ftruncate()(将截断大小设置为 0)。
主要思想是,如果此类曾经被要求打开一个具有非空日志文件的文件,那么您就知道写入被中断了,您可以从日志文件中读取最后一次写入的位置,然后 fseek 到那个地方您丢失了最后的部分写入,但文件不应损坏。
不幸的是,ftruncate() 似乎是异步的。实际上,即使我在 ftruncate 之后调用 fflush() 和 fsync(),我也会看到日志在进行大量写入时增长到数百字节。它最终总是以 0 结束,但我希望看到它始终为 0 号或 8 号。
是否可以使 ftruncate 完全同步?还是有更好的方式使用该期刊?
最佳答案
ftruncate()
不会更改文件描述符在文件中的写入偏移量。如果您在调用 ftruncate()
后保持文件打开并写入下一个长度,那么发生的情况是文件的偏移量仍在增加。当您写入时,它会将文件的长度重置为偏移量,然后将您的字节写入那里。
您可能想要做的是在调用 ftruncate()
之后调用 lseek(fd, 0, SEEK_SET)
以便下一次写入文件在文件的开头。
关于c++ - ftruncate() 是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9154551/