我们有一个包含始终需要保持一致的数据的文件。当需要修改时,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)
这可以防止文件的主要路径被另一个进程秘密更改,即“符号链接攻击”。