对文件调用fsync()时,文件是否会损坏?
例如,假设我的文件分布到磁盘块:

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

假设我想将整个文件内容更改为小写(以非常低效的方式)。所以我试图在文件的位置1把“h”改成“h”,然后在位置8把“w”改成“w”。然后我在文件上调用fsync()。文件分布在两个磁盘块上。
是否保持写操作的顺序?
fsync()操作在磁盘上是原子的吗?

最佳答案

只有将两个写操作以及任何相关的元数据都写入磁盘后,fsync调用才会返回。如果您的计算机崩溃(通常是由于断电),并且您有一个损坏的文件,那么就向文件系统维护人员记录一个错误报告-这不应该发生。如果fsync返回,则数据安全地存储在磁盘上。
不过,要回答您的问题,文件系统和磁盘驱动程序没有理由不能重新排列写入顺序(它们认为它们是不重叠的,如果磁盘头在旋转介质上,那么可以先写第二个)。其次,fsync不可能是原子的,因为它处理的是现实生活中的硬件。但对用户来说,它应该是原子式的(您将拥有文件的第一个副本或第二个副本,但不会有损坏的内容)。

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

10-10 12:37