有没有一种方法可以将缓冲区原子地转储到文件中?
所谓“原子性”,是指:例如在写入过程中某人终止了我的应用程序时,我希望文件处于写入之前或之后的状态,而不是处于损坏的中间状态。
如果答案是“否”,那么可能可以使用非常小的缓冲区来完成吗? 例如,我是否可以使用单个8字节fwrite(在x64平台上),将两个连续的int32_t变量转储,并确保这两个int32被转储,或者二者都未被转储,而不仅仅是其中一个?
有没有一种方法可以将缓冲区原子地转储到文件中?
所谓“原子性”,是指:例如在写入过程中某人终止了我的应用程序时,我希望文件处于写入之前或之后的状态,而不是处于损坏的中间状态。
如果答案是“否”,那么可能可以使用非常小的缓冲区来完成吗? 例如,我是否可以使用单个8字节fwrite(在x64平台上),将两个连续的int32_t变量转储,并确保这两个int32被转储,或者二者都未被转储,而不仅仅是其中一个?
我建议先写入临时文件,然后再对其进行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");
fsync
同步文件。否则,如果出现断电情况,你可能会得到一个空文件。 - Emiltmpfs
中,则不需要。 - Gillespiefsync
操作。 - Vad