如果我想重命名A
to B
,但前提是B
不存在,天真的事情会检查是否B
存在(与access("B", F_OK)
或类似的东西),如果不继续rename
。不幸的是,这会打开一个窗口,在此期间其他进程可能会决定创建B
,然后它被覆盖 - 更糟糕的是没有迹象表明类似的事情曾经发生过。
其他文件系统访问功能不会受到此影响 -open
has O_EXCL
(所以复制文件是安全的),最近 Linux 有了一整套*at
系统调用可以防止大多数其他竞争条件 - 但不是这个特定的条件(renameat
存在,但可以防止完全不同的问题)。
那么它有解决办法吗?
你应该能够link http://www.manpagez.com/man/2/link/(2)给新的文件名。如果链接失败,那么您就放弃,因为该文件已经存在。如果链接成功,您的文件现在同时以旧名称和新名称存在。然后你unlink http://www.manpagez.com/man/2/unlink/(2)旧名。没有可能的竞争条件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)