跨数据块的fsync()原子性

时间:2016-10-31 03:35:13

标签: c linux acid fsync

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

例如,假设我的文件传播到磁盘块:

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

假设我想将整个文件内容更改为小写(以非常低效的方式)。因此,我试图将文件的第1位改为" H"进入" h"然后在第8位改变" W"到" w"。然后我在文件上调用fsync()。该文件分布在两个磁盘块上。

  1. 是否保留了写入顺序?
  2. fsync()操作是否是磁盘上的原子*

1 个答案:

答案 0 :(得分:0)

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

要回答你的问题,没有理由说文件系统和磁盘驱动程序无法重新排序写入(他们认为它们是非重叠的,如果磁盘头是磁盘头,那么首先编写第二个可能是有用的。在旋转媒体上)。其次,fsync无法成为原子,因为它涉及现实生活中的硬件。它应该以原子方式对用户进行操作(您将获得该文件的第一个副本或第二个副本,但不会损坏。)