我有两个文件A
和B
,每个文件都有自己的内容。
我想交换这两个文件,因此A
将成为B
,而B
将成为A
。但我想保证,没有其他进程会发现这两个文件处于不一致的状态,也没有任何进程会发现任何这些文件丢失,即使是很短的时间。因此,作为一项副业,我还要保证,如果在操作过程中出现任何问题,任何事情都不会改变(有点像我认为的交易)。
在OS X上有一个exchangedata()
函数,所以我想我正在寻找与它相当的Linux,或者至少是一个等效的原子文件交换方法。
答案 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的文件。