gpt4 book ai didi

c++ - ftruncate() 是异步的吗?

转载 作者:行者123 更新时间:2023-11-30 00:57:02 25 4
gpt4 key购买 nike

我正在尝试用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com