c - fsync() 跨数据 block 的原子性

标签 c linux acid fsync

在文件上调用 fsync() 时,文件会损坏吗?

例如,假设我的文件分布在磁盘 block 上:

    A             B
|---------|    |--------|
| Hello,  | -> | World! |
|---------|    |--------|
| 1234567 |    | 89abcd |
|---------|    |--------|

假设我想将整个文件内容更改为小写(以一种非常低效的方式)。因此,我试图将文件的第 1 个位置将“H”更改为“h”,然后将第 8 个位置的“W”更改为“w”。然后我对该文件调用 fsync()。该文件分布在两个磁盘 block 中。

  1. 写入的顺序是否保持不变?
  2. fsync() 操作是否是跨磁盘的原子操作

最佳答案

fsync 调用不会返回,直到两次写入以及任何关联的元数据都写入磁盘。如果您的计算机崩溃(通常是由于断电)并且您有损坏的文件,请向文件系统维护人员记录错误报告 - 这是不应该发生的。如果 fsync 返回,则数据已安全地存储在磁盘上。

虽然要回答你的问题,文件系统和磁盘驱动程序没有理由不能重新排序写入(他们认为它们是非重叠的,如果磁盘头所在的位置,那么先写入第二个可能有用在旋转介质上)。其次,fsync 不可能是原子的,因为它处理现实生活中的硬件。它应该对用户以原子方式行动(您将拥有文件的第一个副本或第二个副本,但不会损坏任何东西)。

关于c - fsync() 跨数据 block 的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40336233/

相关文章:

c - 打印所有全局变量/局部变量?

C:写一个循环来打印两个字符之间的字母表

c - 如何在eclipse控制台中看到printf(C代码)?

c - fatal error : sys/socket. h:32 位上没有这样的文件或目录

linux - 有没有办法查看谁在 Linux 中查看/访问了文件?

linux - 对于本地运行的 scala spray 服务器,curl localhost 有效,但 curl <local ip> 获取 "Connection refused"

sqlite - SQLite3的数据库文件在突然断电或系统崩溃时会损坏吗?

c++ - gcc 的非空终止字符串编译器选项

mysql - 原子计数器 - redis 与 postgres 或其他?

Mysql XA 隔离级别