问题描述
考虑我有一个文件 foo.dat
,我更新如下:
$ $ $ $ $ $ c $ lseek(fd,pos_a,SEEK_SET) ;
write(fd,data_a,size_a); //< - 操作A
lseek(fd,pos_b,SEEK_SET);
write(fd,data_b,size_b); //< - 操作B
lseek(fd,pos_c,SEEK_SET);
write(fd,data_c,size_c); //< - 操作C
这样我可以在文件A,B,C中进行更新。 - 软件崩溃或例如电源故障。
有没有任何担保,如果他们被执行的操作是以相同的顺序完成。
即那就不会有什么或A或A和B或A和B和C而不是A和C或我知道如果我在A和B之间调用 fsync(fd)
并且在A之间是相同的和C但它
也保证实际上在文件系统上。
我不关心数据的松散,而是关于它的一致性。
POSIX标准保证不会有乱序执行吗?
所以:
- 有没有这样的保证?
- 在POSIX平台上
- ?
- 如果没有什么保证(除了
fsync
),我可以拥有?
这是POSIX强制要求 $ b
This does not provide you with a guarantee that your data will hit the disk in that order at all. The implementation can re-order physical writes all it wants as long is what the applications "see" is consistent with the above two statements.
In practice, the kernel, and even the disk subsystem (think SANs for instance) can re-order writes (for performance reasons usually).
So you can't rely on the order of your write calls for consistency. You'll need f[data]sync
s.
Interesting email thread on the PostgreSQL mailing list: POSIX file updates. Reading on how databases handle I/O is a great way to learn about this type of issue.
(Sorry, don't know about Windows in this respect.)
这篇关于保证文件操作的顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!