Unix中有一个unlink
系统调用,它以路径作为参数,并将该路径与inode断开链接。
假设这种情况。我将打开一个文件,访问内容,然后决定应该取消链接。此时,由于某种原因,不同的进程已经将该路径替换为不同的文件。现在,如果我使用该路径调用unlink,它将取消链接错误的文件,并可能混淆其他进程。
因此,有没有一种方法可以将inode号沿着路径一起传递给(safe)unlink
系统调用,以便它可以原子地检查路径是否引用相同的inode,然后取消链接,如果没有,则报告errno或执行no-op?
有没有办法在Unix中做到这一点?如果没有,为什么它被遗漏了?这样的系统调用是不是因为某种原因而不必要?它可以使用其他系统调用的组合来模拟?它是不是被错误地遗漏了?
1条答案
按热度按时间6ju8rftf1#
据我所知,
unlink()
功能没有接口可以避免这里描述的竞争条件。POSIX中的文件存储操作一直存在名称替换的风险; Linux添加了
openat()
、unlinkat()
等来减轻这些风险,但从未添加检查最终名称是否匹配预期inode的接口。我不认为有一种方法可以在不添加syscall API的情况下获得这种原子的unlink if-matching行为,因为我们在这里从用户空间所做的任何事情都会受到竞争的影响。唯一的可能性是如果您的目标系统支持目录上的强制访问锁,并且具有
unlinkat()
的等效物。