在Linux上以原子方式交换两个文件的内容

时间:2015-01-09 13:50:54

标签: linux libc

我有两个文件AB,每个文件都有自己的内容。

我想交换这两个文件,因此A将成为B,而B将成为A。但我想保证,没有其他进程会发现这两个文件处于不一致的状态,也没有任何进程会发现任何这些文件丢失,即使是很短的时间。因此,作为一项副业,我还要保证,如果在操作过程中出现任何问题,任何事情都不会改变(有点像我认为的交易)。

在OS X上有一个exchangedata()函数,所以我想我正在寻找与它相当的Linux,或者至少是一个等效的原子文件交换方法。

2 个答案:

答案 0 :(得分:9)

您可以使用(最近的)linux syscall renameat2

这是定义:

int renameat2(int olddir, const char *oldname, 
      int newdir, const char *newname, unsigned int flags);

如果需要,您可以在the kernel's Git repo找到其源代码。

它与renameat基本相同,但是如果你传递RENAME_EXCHANGE标志,它将交换这两个文件,而不是将一个文件重命名为另一个文件。

该操作是原子的。

答案 1 :(得分:1)

我取决于你的意思"不一致的状态"。如果两个文件相同的时间段可以接受,那么您可以这样做:

ln A C
ln B D
ln -f D A  
# now, A and B have the same content
ln -f C B

它还取决于您已经打开文件的进程所需的行为。请记住,路径不是文件,而只是指向文件的链接,因此如果进程1通过路径“A'”打开文件,然后交换名称A和B,进程1仍将打开名称为A的文件。