Unix环境下的高级编程3rd,4.21,我想了解rmdir如何处理链接计数

Unix环境下的高级编程3rd,4.21,我想了解rmdir如何处理链接计数

我在 APUE 3rd, 4.21 中读到了这一点:如果一个或多个进程在链接计数达到 0 时打开了目录,则在该函数返回之前将删除最后一个链接,并删除点和点点条目。我只是无法理解这一点,我认为“链接计数达到0”应该是“链接计数达到2”,一个空目录至少有2个链接计数。我想知道 rmdir 如何处理链接计数?

答案1

你很困惑。 rmdir根本不关心链接计数。逻辑非常简单。

一旦文件有链接数为 0,并且没有正在运行的进程具有引用(文件描述符或当前目录),它将被真正删除。此时磁盘空间可以重新用于其他用途 [*]。

目录是一个文件。但是取消链接(将它们从父级中删除)比其他类型的文件需要更多的考虑。我们必须确保该目录的每个子目录也未链接。否则,我们可能会失去更新子级链接计数的机会。我们将永久失去该磁盘空间。

所以我们不允许用户调用unlink目录。相反,他们必须使用特殊用途的rmdir.调用仅在两个方面rmdir有所不同unlink

  1. 它要求目录为“空”,这意味着它的唯一子目录是标准...条目。
  2. 它确保unlink在目录本身上运行之前取消这两个剩余条目的链接。

那是。没有其他魔法。 rmdir不会推迟到第 1 点中的条件成立为止。 rmdir在调用时要么成功,要么失败。该条件也不以任何方式基于链接计数。


我发现条目对链接计数的影响.很有趣,尽管这不是特殊情况。它是到父目录的硬链接,因此增加了它的链接计数。这就是为什么新创建的目录 DIR 的链接计数为 2 的原因。如果您随后调用rmdir DIR,链接计数将回落到 0,因为它会删除链接DIR/.DIR


Linux 实际上允许您通过在目录内运行 shell 并ls -ld在目录取消链接(从其父目录中删除)后运行来观察上述情况。

当然ls -ld是简写ls -ld .。 即使在目录条目被删除后也能继续工作...事实上,现代 Linux 并不真正依赖这些磁盘目录条目。我预计最初的 Unix 实现会不是支持这一点。不过,我相信引用计数仍然按上述方式工作,并且没有删除目录的特殊情况。

(如何..继续工作更有趣。在下面的评论中讨论)。

事实上,您可以很容易地查看rmdir.它是作为以特殊权限运行的用户程序来实现。历史 Unix 代码很容易在网上找到。这是我对此如此充满信心的原因之一。


df .[*] 因此,您可以通过查找已用磁盘块(或 i 节点)中的差异来查看文件是否已被删除df -i .。这种方法在 Linux 等文件系统中效果很好ext4。不过,不太传统的文件系统可能有更复杂的优化,这可能会使其更难以观察。

相关内容