我有两个文件,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标志,它将交换两个文件,而不是将一个文件重命名为另一个.
该操作是原子的.