在文件重命名的应用程序崩溃但文件系统正常的情况下,一致性保证是什么?
关于如何确保数据在文件系统崩溃中幸免(由于断电等),有很多文献,但是我找不到关于如何确保数据在应用程序崩溃中幸免的讨论。 / p>
具体来说,如果我有一个文件foo.txt
,其初始内容为foo...
(长度为> 4k)并运行
FILE* f = fopen("foo.txt.tmp", "w");
char buf[] = "bar..."; // sizeof(buf) > 4k
fwrite(buf, sizeof(char), sizeof(buf), f);
fclose(f);
rename("foo.txt.tmp", "foo.txt")
是否可以确保在文件系统运行状况良好的情况下,任何读取foo.txt
的应用程序只能看到foo...
或bar...
?还是在fsync(f)
之前没有fclose)
意味着单独的应用程序可能会看到某些中间状态?
我用一个写入线程和多个并发读取线程进行了模糊测试,该测试没有观察到任何部分状态,但这并不一定排除观察到部分状态的可能性。
我对Linux下ext4文件系统的行为最感兴趣。