我想知道文件/文件系统上的操作顺序是否有任何保证。
考虑我有一个文件foo.dat
,我将其更新如下:
lseek(fd,pos_a,SEEK_SET);
write(fd,data_a,size_a); //< - Operation A
lseek(fd,pos_b,SEEK_SET);
write(fd,data_b,size_b); //< - Operation B
lseek(fd,pos_c,SEEK_SET);
write(fd,data_c,size_c); //< - Operation C
这样我在文件A,B,C中进行更新。可能会发生一些故障 - 软件崩溃或电源故障等。
是否保证执行操作的顺序相同。
即。没有任何东西或“A”或“A和B”或“A和B和C”
但不仅仅是“A和C”或“B”等情况。
我知道如果我在A和B fsync(fd)
之间打电话,在A和C之间打电话但是相同
也保证实际上是在文件系统上。
我不太关心数据的松散,而是关注它的一致性。
POSIX标准是否保证不会出现无序执行?
所以:
fsync
)我可以拥有?答案 0 :(得分:3)
这就是POSIX对write所要求的:
成功返回常规文件的write()之后:
从该写入修改的文件中的每个字节位置成功读取()将返回该位置的write()指定的数据,直到再次修改这些字节位置为止。
< / LI>对文件中相同字节位置的任何后续成功write()都将覆盖该文件数据。
这并不能保证您的数据完全按照该顺序命中磁盘。只要应用程序“看到”与上述两个语句一致,实现就可以重新排序所需的物理写入。
实际上,内核,甚至磁盘子系统(例如SAN)都可以重新排序写入(通常是出于性能原因)。
因此,您不能依赖写入调用的顺序来保持一致性。您需要f[data]sync
s。
PostgreSQL邮件列表上有趣的电子邮件帖子:POSIX file updates。阅读数据库如何处理I / O是了解此类问题的好方法。
(抱歉,在这方面不了解Windows。)