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