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

标签 c++ atomic acid

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

相关文章:

c++ - 如何在 VC++ 中将 HICON 转换为 HBITMAP?

c++ - ifstream 打开失败时如何获取错误消息

c++ - 涉及前/后增量和指针的 C 程序输出

c++ - 使用 clang 对 std::atomic 函数的调用不明确

c - 使用 gcc 原子内置函数?

mysql - 如何改进尝试在大型数据库中查找重复条目的 MySql 查询?

ios - Core Data 可以在 iOS 上提供什么(如果有的话)ACID 保证?

c++ - 如何在C++上解码字符串

c++ - 调整 std::vector<std::atomic bool> 的大小,将 true 分配给所有原子书

sql-server - SQL Server 和数据库的 ACID 属性