Atomically swap contents of two files on Linux

◇◆丶佛笑我妖孽 提交于 2019-12-04 07:28:10

You can use the (fairly recent) linux syscall renameat2

Here is the definition :

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

You can find its source code on the kernel's Git repo if needed.

It's basically the same as renameat, but if you pass the flag RENAME_EXCHANGE it will swap the two files instead of renaming one into the other.

The operation is atomic.

I depends on what you mean by "inconsistent state". If it is acceptable for there to be a period of time during which the two files are identical, then you can simply do:

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

It also depends on the behavior you want for processes that already have the file opened. Remember that paths are not files, but merely links to a file, so if process 1 opens a file via the path 'A', and then you swap the names A and B, process 1 will still have the file opened that was referred to by the name A.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!