首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果旧的和新的都一样,为什么什么都不重命名呢?

如果旧的和新的都一样,为什么什么都不重命名呢?
EN

Unix & Linux用户
提问于 2023-02-20 18:31:08
回答 1查看 33关注 0票数 0

我的代码正在执行类似于link(link_target, hardlink_tmp); rename(hardlink_tmp, hardlink);的操作,目的是始终拥有一个有效的dentry hardlink。我希望它能在dentries上运行,而且不会留下一个hardlink_tmp

然而,今天我发现了许多剩余的hardlink_tmp文件。浏览rename(2)显示:

代码语言:javascript
复制
If oldpath and newpath are existing hard links referring to the same file, then rename() does nothing, and returns a success status.

rename(3p)中的措辞略有不同:

代码语言:javascript
复制
If the old argument and the new argument resolve to either the same existing directory entry or different directory entries for the same existing file, rename() shall return successfully and perform no other action.

现在,我需要一个最终的unlink(hardlink_tmp);来删除一个可能过时的条目。

为什么这会是令人向往的行为?

EN

回答 1

Unix & Linux用户

发布于 2023-02-20 20:02:32

将两个名称重命名为同一个文件的限制也在POSIX规范中。它在“基本原理”一节中说

如果旧的和新的引用同一个文件的规范是为了保证: rename("x","x");不删除该文件。

这有点简单化,但考虑到理论上还提到了rename()作为link()+unlink()的替代方案,我想到--我在这里纯粹推测--一个简单的实现可以将rename(x, y)实现为unlink(y) && link(x, y) && unlink(x)。但如果xy同名的话,这将使文件在第一步中消失。

检查这两个名称是否是完全相同的字符串也是不够的,因为您可能会遇到类似于rename("../foo/x", "x") (当您坐在foo/的时候),或者更糟的是rename("/dir/symlink/x", "x") (其中的符号链接将您带回到.)。检查这两个字符串是否导致相同的文件名并不那么容易,但是在这两个字符串上调用stat()并检查设备和inode编号以查看它们是否是相同的inode比较容易。然后,当重命名是两个不同的文件名但文件相同时,也会拒绝重命名。

这并不是说现代的rename()智能实现不能做得更好,这是你所期望的,但是它可能已经根据它的工作方式被编码了。(结束猜测)

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/736236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档