Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Filesystems 文件操作顺序的保证_Filesystems - Fatal编程技术网

Filesystems 文件操作顺序的保证

Filesystems 文件操作顺序的保证,filesystems,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_

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

假设我有一个文件
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
lseek(fd、位置a、寻道集);
写入(fd、数据a、大小a);//<-行动A
lseek(fd、位置b、寻道集);
写入(fd、数据、大小);//<-行动B
lseek(fd、位置c、寻道集);
写入(fd、数据、大小);//<-操作C
这样,我在文件A、B、C中进行更新,可能会出现一些故障-软件崩溃或例如电源故障

是否有任何保证,如果执行这些操作,它们是按照相同的顺序执行的

i、 e.将没有任何内容或“A”或“A和B”或“A和B和C”

但不是像“A和C”或“B”这样的情况

我知道如果我在A和B之间调用
fsync(fd)
,在A和C之间调用相同,但是 还可以保证它实际上位于文件系统上

我不太关心松散的数据,而是关心数据的一致性

POSIX标准是否保证不会出现无序执行

因此:

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

这就是POSIX的要求:

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

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

  • 任何后续对文件中相同字节位置的成功写入()都将覆盖该文件数据

这并不能保证您的数据将以该顺序进入磁盘。只要应用程序“看到”的内容与上述两条语句一致,实现就可以重新排序物理写入

实际上,内核甚至磁盘子系统(比如SANs)都可以重新排序写操作(通常出于性能原因)

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

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


(很抱歉,我不知道Windows在这方面的情况。)

我想补充一点,您的回答让我阅读了本文档:并理解没有“神奇”的解决方案。我只需要以智能的方式使用fsync。