的Linux API更名行为,当新指向现有的文件
问题描述:
当我阅读文档rename
在https://linux.die.net/man/3/rename的页面,我发现下面的Linux API更名行为,当新指向现有的文件
如果存在通过新的参数命名的链接,它应是删除并重新更名为新的。在这种情况下,名为new的链接在整个重命名操作中对其他进程始终可见,并在操作开始之前引用new或old引用的文件。对于包含旧目录的目录和包含新目录的目录都需要写入访问权限。
我应该如何理解以下
是指无论是通过新的或旧提到的文件的操作在这种情况下开始
与具有相同名称的文件之前什么new
点存在,则在重命名操作后,new
应该指向old
或new
。但文件说这是before the operation began
这让我感到困惑。
我应该怎么理解?你能举个例子吗?
答
这句话的含义是,在rename
期间,旧的new
被替换为新的new
原子。
这意味着在重命名操作期间尝试访问new
将导致找不到文件错误。每次访问都会导致返回旧的或新的new
。
在完成rename
(假设成功完成)后,当然将以该名称引用新的new
。
这突出rename
的原子替换文件的用处。如果你有一个包含一些重要文件的路径,并且你需要更新该文件,使得无论发生什么事,任何人在任何时候打开/var/lib/important
都将获得旧版本或新版本,这是您需要的操作序列请执行以下操作:
- 使用路径
/var/lib/important.new
创建文件的更新版本。 - 冲洗并关闭
/var/lib/important.new
。 rename("/var/lib/important.new", "/var/lib/important");
- 根据您的使用情况,冲洗
/var/lib
。
这保证无论发生什么事情(进程崩溃,电源故障,内核故障),旧的或新的文件都可用,完整且正确。
只有当您需要依赖它作为可用文件的新版本时,才需要最后一步(刷新目录)。如果您不这样做,电源故障可能会导致旧文件在重新启动后重新出现。典型用途不用担心这一步。