对文件调用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/