Unix 中有一个
unlink
系统调用,它采用路径作为参数,并取消该路径与 inode 的链接。
假设这个案例。我将打开一个文件,访问其内容,然后决定应取消链接。此时,由于某种原因,不同的进程已用不同的文件替换了该路径。现在,如果我使用该路径调用 unlink,它将取消链接错误的文件,并且可能会混淆其他进程。
因此,有没有办法可以将 inode 编号以及路径传递给
(safe)unlink
系统调用,以便它可以自动检查路径是否引用相同的 inode,然后取消链接,如果没有报告 errno 或执行 no-奥?
有没有办法在 Unix 中做到这一点?如果不是,为什么它被排除在外?由于某种原因不需要这样的系统调用吗?可以使用其他系统调用的组合来模拟它吗?是不是不小心漏掉了?
据我所知,没有任何接口可以避免此处描述的竞争条件。
POSIX 中的文件系统操作一直存在名称替换的风险; Linux 添加了unlink()
、
openat()
等来缓解这些问题,但从未添加检查最终名称与预期 inode 匹配的接口。我认为没有办法在不添加系统调用 API 的情况下获得这种原子取消链接如果匹配行为,因为我们在用户空间所做的任何事情都会受到竞争的影响。唯一的可能性是,如果您的目标系统支持对目录的强制访问锁定,并且具有相当于 unlinkat()
。