Unix 中是否有 safeunlink 系统调用?

Is there a safeunlink syscall in Unix?

提问人:Sourav Kannantha B 提问时间:10/22/2023 更新时间:10/22/2023 访问量:24

问:

Unix 中有一个 syscall,它采用路径作为参数,并将该路径与 inode 断开链接。unlink

假设这种情况。我将打开一个文件,访问其内容,然后决定取消链接。此时,由于某种原因,不同的进程已将该路径替换为其他文件。现在,如果我使用该路径调用 unlink,它将取消链接错误的文件,并可能混淆其他进程。

因此,有没有办法将 inode 编号与路径一起传递给 syscall,以便它可以原子地检查路径是否引用相同的 inode,然后取消链接,如果不报告 errno 或执行 no-op?(safe)unlink

在Unix中有什么方法可以做到这一点吗?如果不是,为什么会遗漏它?出于某种原因,这样的系统调用是没有必要的吗?可以使用其他系统调用的组合来模拟它吗?是不是误漏了?

UNIX 文件系统 系统调用 取消链接 inode

评论

0赞 Toby Speight 10/22/2023
Linux 有,但这仍然不是你要找的(我认为你不能通过一条空的路径)。unlinkat()
0赞 Sourav Kannantha B 10/22/2023
@TobySpeight是相对路径的,对吧!我不认为这在这种情况下有用。unlinkat
0赞 Sourav Kannantha B 10/22/2023
这个论点类似于为什么我们需要,而我们已经拥有了.tgkilltkill
0赞 Toby Speight 10/22/2023
我的评论是说我认为答案是“不,没有这样的系统调用”。POSIX 没有 ,所以几乎可以肯定它没有你想要的。(顺便说一句,文件描述符可能是比 inode 编号更好的选择,因为它也带有设备编号。unlinkat()
1赞 Toby Speight 10/23/2023
你没有正确阅读。设备或字符设备文件系统条目具有它所代表的设备的 ID。这与包含它的文件系统的设备不同(通常!)。

答:

2赞 Toby Speight 10/22/2023 #1

据我所知,没有功能接口可以避免此处描述的竞争条件。unlink()

POSIX 中的文件系统操作一直存在名称替换的风险;Linux 添加了 ,以及更多来缓解这些问题,但从未添加过检查最终名称是否与预期 inode 匹配的接口。openat()unlinkat()

我认为没有办法在不添加到系统调用 API 的情况下获得这种原子取消链接的行为,因为我们在这里从用户空间所做的任何事情都会受到竞争的影响。唯一的可能性是,如果目标系统支持对目录的强制访问锁,并且具有等效的 .unlinkat()

评论

0赞 Sourav Kannantha B 10/23/2023
最初,他们可能错过了它/降低了它的优先级。但是现在,一旦他们知道自己缺少一些东西,他们就不能添加它吗?
0赞 Sourav Kannantha B 10/23/2023
另外,POSIX中的名称替换问题是什么?
0赞 Toby Speight 10/23/2023
“他们”是谁?如果您想添加此功能,为什么不实现它并发布您的补丁以供考虑呢?
0赞 Sourav Kannantha B 10/23/2023
我还不知道该怎么做。虽然我会检查一下。我所说的“他们”指的是POSIX标准委员会(我知道C++存在这样的事情,但不确定POSIX),因为这需要API更改。