当我在页面https://linux.die.net/man/3/rename中阅读rename
的文档时,我发现了以下内容
如果新参数指定的链接存在,则应将其删除并将旧名称重命名为new。在这种情况下,在整个重命名操作中,名为new的链接应对其他进程保持可见,并在操作开始之前引用由new或old引用的文件。包含old的目录和包含new的目录都需要写访问权限。
我应该如何理解以下
在操作开始之前引用新旧引用的文件
在这种情况下,存在具有相同名称且存在new
点的文件,然后在重命名操作后,new
应指向old
或{{1} }。但该文件称new
让我感到困惑。
我应该如何理解这一点?你能举个例子吗?
答案 0 :(得分:0)
这句话的含义是,在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
。这保证无论发生什么(进程崩溃,电源故障,内核故障),旧文件或新文件都可用,完整和正确。
只有当您需要依赖它作为可用文件的新版本时,才需要最后一步(刷新目录)。如果不这样做,电源故障可能会导致重新启动后重新显示旧文件。典型用途不需要这一步。