当新引用现有文件时,linux api重命名行为

时间:2017-10-13 11:50:40

标签: linux api rename

当我在页面https://linux.die.net/man/3/rename中阅读rename的文档时,我发现了以下内容

  

如果新参数指定的链接存在,则应将其删除并将旧名称重命名为new。在这种情况下,在整个重命名操作中,名为new的链接应对其他进程保持可见,并在操作开始之前引用由new或old引用的文件。包含old的目录和包含new的目录都需要写访问权限。

我应该如何理解以下

  

在操作开始之前引用新旧引用的文件

在这种情况下,存在具有相同名称且存在new点的文件,然后在重命名操作后,new应指向old或{{1} }。但该文件称new让我感到困惑。

我应该如何理解这一点?你能举个例子吗?

1 个答案:

答案 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

这保证无论发生什么(进程崩溃,电源故障,内核故障),旧文件或新文件都可用,完整和正确。

只有当您需要依赖它作为可用文件的新版本时,才需要最后一步(刷新目录)。如果不这样做,电源故障可能会导致重新启动后重新显示旧文件。典型用途不需要这一步。