用原子方式将文件替换为另一个文件

时间:2010-04-02 09:20:00

标签: filesystems posix hardlink

我有两个目录条目,a和b。 之前,a和b指向不同的inode。 之后,我希望b指向同一个inode。 我希望这是安全的 - 我的意思是,如果我在某处失败,b要么指向它的原始inode,要么指向inode。最重要的是我不想以b消失为止。

mv在覆盖时是原子的。

当目的地已经存在时,

似乎不起作用。

所以看起来我可以说:

一个tmp mv tmp b

如果失败,将会留下一个'tmp'文件,这是不可取的,但不是灾难。

有更好的方法吗?

(我实际上要做的是用包含该内容的单个inode替换具有相同内容的文件,在所有目录条目之间共享)

2 个答案:

答案 0 :(得分:1)

 ln a tmp ; mv tmp b
事实上,正如你在问题中所说的那样,

是以原子方式进行的最快方式。

(Nitpickers转角:更快将两个系统调用放在一个程序中)

答案 1 :(得分:0)

ln a tmp && mv tmp b || rm tmp

似乎更好,因为如果ln失败,mv将无法执行(并在失败时将stderr混乱)。