保证文件操作的顺序

时间:2011-09-18 19:34:46

标签: filesystems

我想知道文件/文件系统上的操作顺序是否有任何保证。

考虑我有一个文件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标准是否保证不会出现无序执行?

所以:

  • 有没有这样的保证?
  • 在POSIX平台上?
  • 在Windows平台上?
  • 如果没有什么保证(除了fsync)我可以拥有?

1 个答案:

答案 0 :(得分:3)

这就是POSIX对write所要求的:

  

成功返回常规文件的write()之后:

     
      
  • 从该写入修改的文件中的每个字节位置成功读取()将返回该位置的write()指定的数据,直到再次修改这些字节位置为止。

    < / LI>   
  • 对文件中相同字节位置的任何后续成功write()都将覆盖该文件数据。

  •   

这并不能保证您的数据完全按照该顺序命中磁盘。只要应用程序“看到”与上述两个语句一致,实现就可以重新排序所需的物理写入。

实际上,内核,甚至磁盘子系统(例如SAN)都可以重新排序写入(通常是出于性能原因)。

因此,您不能依赖写入调用的顺序来保持一致性。您需要f[data]sync s。

PostgreSQL邮件列表上有趣的电子邮件帖子:POSIX file updates。阅读数据库如何处理I / O是了解此类问题的好方法。

(抱歉,在这方面不了解Windows。)