当我阅读https://linux.die.net/man/3/rename页中rename
的文档时,我发现
如果存在由新参数命名的链接,则应该将其删除,并将旧的重命名为新的。在这种情况下,命名为new的链接在整个重命名操作期间对其他进程保持可见,并在操作开始之前引用new或old引用的文件。包含old的目录和包含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
。
这保证了无论发生什么(进程崩溃、电源故障、内核故障),旧文件或新文件都是可用的、完整的和正确的。
最后一步(刷新目录)只有在需要依赖于它是可用文件的新版本时才是必需的。如果不这样做,电源故障可能会导致旧文件在重新启动后重新出现。典型的用法不必考虑这个步骤。
关于linux - 新引用现有文件时linux api重命名行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46729287/