2017-10-13 20 views
0

当我阅读文档renamehttps://linux.die.net/man/3/rename的页面,我发现下面的Linux API更名行为,当新指向现有的文件

如果存在通过新的参数命名的链接,它应是删除并重新更名为新的。在这种情况下,名为new的链接在整个重命名操作中对其他进程始终可见,并在操作开始之前引用new或old引用的文件。对于包含旧目录的目录和包含新目录的目录都需要写入访问权限。

我应该如何理解以下

是指无论是通过新的或旧提到的文件的操作在这种情况下开始

与具有相同名称的文件之前什么new点存在,则在重命名操作后,new应该指向oldnew。但文件说这是before the operation began这让我感到困惑。

我应该怎么理解?你能举个例子吗?

回答

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

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

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