读取正在使用写时复制修改的文件的最佳方法是什么?

读取正在使用写时复制修改的文件的最佳方法是什么?

我们有一个包含始终需要保持一致的数据的文件。当需要修改时,Process 1创建一个新文件,将修改写入新文件,并使用mv将新文件重命名为旧文件名。

如果我们有另一个进程Process 2需要读取这个文件,我们如何保证它总是读取一致的文件,即读取过程中mv的 byProcess 1不会导致数据损坏?

答案1

您可以通过在与旧文件相同的文件系统上创建新文件并使用rename(2)保证是原子的 [1] 函数来保证这一点。

在 Unix 文件系统上, arename(2)只作用于目录条目,它不会影响任何对原始目录条目指向的 inode 有打开句柄的进程;该进程将继续读取或写入旧文件。

通常,该mv(1)实用程序只会调用rename(2),但在失败的情况下,它可能会回退到删除+复制或其他可疑的非原子操作rename(2)

请注意,同一文件系统上的两个文件可能无法保证 arename(2)会成功 - 有些文件系统9pfs不支持重命名操作,因此必须以某种方式制造它。

[1] 甚至更好,renameat(2)这可以防止文件的主要路径被另一个进程秘密更改,即“符号链接攻击”。

相关内容