ftruncate() 是异步的吗?

问题描述 投票:0回答:1

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

首先,我将当前文件位置(距文件开头的 64 位偏移量,以字节为单位)写入单独的日志文件。然后,我将请求的数据写入数据文件的末尾。最后,我在日志文件上调用

ftruncate()
(将截断大小设置为 0)。

主要思想是,如果此类被要求打开一个具有非空日志文件的文件,那么您就知道写入被中断,您可以从日志文件中读取最后一次写入的位置,然后

fseek()
那个地方。您丢失了最后的部分写入,但文件不应损坏。

不幸的是,

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

是否可以使

ftruncate()
完全同步?或者有更好的方法使用日记吗?

c++ atomic acid
1个回答
7
投票

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

可能您想要做的是在调用

lseek(fd, 0, SEEK_SET)
后调用
ftruncate()
,以便下一次写入文件将发生在文件的开头。

© www.soinside.com 2019 - 2024. All rights reserved.