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

ant*_*one 5 linux libc

我有两个文件,A并且B,每一个都有自己的内容.

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

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

tux*_*ux3 11

你可以使用(最近的)linux系统调用renameat2

这是定义:

int renameat2(int olddir, const char *oldname, 
      int newdir, const char *newname, unsigned int flags);
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在内核的Git仓库中找到它的源代码.

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

该操作是原子的.