原子写入linux上的文件

mam*_*sun 9 c++ linux file file-writing

有没有办法将缓冲区转储到文件原子?

"原子地"是指:如果有人在写作期间终止我的应用程序,我希望文件处于写入前或写入状态,但不是处于损坏的中间状态.

如果答案是"否",那么可能是用一个非常小的缓冲区来完成的?例如,我可以使用单个8字节fwrite(在x64平台上)转储2个后续的int32_t变量,并确保这两个int32都被转储,或者它们都没有,但不仅仅是其中一个?

Gil*_*pie 9

我建议写一个临时文件然后再写一个rename(2).

ofstream o("file.tmp"); //Write to a temporary file
o << "my data";
o.close();

//Perform an atomic move operation... needed so readers can't open a partially written file
rename("file.tmp", "file.real");
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的方法.在POSIX系统上,一旦打开文件描述符,它的inode就会保证存在,直到文件描述符被销毁.因此,无论写入如何,旧文件的读者都可以保证看到相同的数据.重命名操作保证在同一文件系统上是原子操作,因此,这个习惯用法使读写和写入并发安全. (4认同)
  • 这还不够。在重命名文件之前,您必须“fsync”该文件。否则,在断电的情况下,您可能会得到一个空文件。 (2认同)