Unix中有safeunlink系统调用吗?

wlsrxk51  于 2023-11-18  发布在  Unix
关注(0)|答案(1)|浏览(154)

Unix中有一个unlink系统调用,它以路径作为参数,并将该路径与inode断开链接。
假设这种情况。我将打开一个文件,访问内容,然后决定应该取消链接。此时,由于某种原因,不同的进程已经将该路径替换为不同的文件。现在,如果我使用该路径调用unlink,它将取消链接错误的文件,并可能混淆其他进程。
因此,有没有一种方法可以将inode号沿着路径一起传递给(safe)unlink系统调用,以便它可以原子地检查路径是否引用相同的inode,然后取消链接,如果没有,则报告errno或执行no-op?
有没有办法在Unix中做到这一点?如果没有,为什么它被遗漏了?这样的系统调用是不是因为某种原因而不必要?它可以使用其他系统调用的组合来模拟?它是不是被错误地遗漏了?

6ju8rftf

6ju8rftf1#

据我所知,unlink()功能没有接口可以避免这里描述的竞争条件。
POSIX中的文件存储操作一直存在名称替换的风险; Linux添加了openat()unlinkat()等来减轻这些风险,但从未添加检查最终名称是否匹配预期inode的接口。
我不认为有一种方法可以在不添加syscall API的情况下获得这种原子的unlink if-matching行为,因为我们在这里从用户空间所做的任何事情都会受到竞争的影响。唯一的可能性是如果您的目标系统支持目录上的强制访问锁,并且具有unlinkat()的等效物。

相关问题