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
- 通过该写入操作修改的文件中每个字节位置的任何成功读取()都将返回write()为该位置指定的数据,直到再次修改这些字节位置为止
- 任何后续对文件中相同字节位置的成功写入()都将覆盖该文件数据
f[data]sync
s
PostgreSQL邮件列表上有趣的电子邮件线程:。阅读数据库如何处理I/O是了解这类问题的好方法
(很抱歉,我不知道Windows在这方面的情况。)我想补充一点,您的回答让我阅读了本文档:并理解没有“神奇”的解决方案。我只需要以智能的方式使用fsync。