当目录的硬链接数变为0时,目录是否被删除?

当目录的硬链接数变为0时,目录是否被删除?

当目录的硬链接数变为0时,目录是否被删除?

一个目录总是至少有 2 个硬链接,因为..当rm -r一个目录时,是否将硬链接数从2减少到0,而不是1?

目录的硬链接数量可以为 1 吗?

谢谢。

答案1

传统设计的 UNIX 文件系统上的任何文件,其引用计数(例如硬链接计数的总和打开文件句柄的数量*)达到 0 时将被删除。然而,在现代 UNIX 系统上,rmdir系统调用在单个操作中删除空目录,而不是逐一删除...

然而,在历史上的 UNIX 系统中,这个系统调用并不存在。相反,rmdir 命令是一个 setuid 程序(源代码可以在这里找到),它检查目录是否为空(特殊条目除外),然后按顺序删除...,然后删除目录本身,所有这些unlink都使用仅允许 root 在目录上使用的系统调用(因此为什么命令是 setuid)。因此,在这些系统上,目录的链接计数在.被删除后将暂时为 1,但在从父目录中删除该目录之前,它将为 0。

顺便说一句,该rm命令甚至阻止 root 删除目录。并会在清空目录内容后rm -r调用命令来删除目录。rmdir

在这些历史系统上,误用以unlinkroot 身份运行的程序的调用、遇到与rmdir或 的竞争条件mv,或者在当前目录已被删除的进程中创建文件(现代系统阻止这种情况),可能会导致悬空文件或目录其硬链接计数大于 0 但不存在于目录树中。这种情况由 检测到dcheck,并且仍然是检查之一,fsck因为它在大多数文件系统上在物理上仍然是可能的。


顺便说一句,文件系统不需要将目录(包括...)实现为具有硬链接的普通文件。在这些文件系统上,目录的硬链接计数将始终报告为0(但当然,它在父目录中的存在符合“引用计数”1)。


已删除目录的行为(例如,当由已打开该目录或将其作为当前目录的进程检查时)以及目录的“链接计数”的确切含义未指定。例如,在 Mac OS X 上,它将报告硬链接计数为 2,即使它没有真正的硬链接。即使...未出现在列表中,该目录也可以打开并stat可以使用名称.或进行调用..。在 Linux 上,链接计数为 0,但.同样..仍然有效。

Mac OS X 还报告了全部文件目录中的链接计数,而不仅仅是子目录的数量。但即使当...消失时,它仍然是 2 。


*这包括正常打开描述符、内存映射部分(包括例如执行二进制文件和共享库)以及进程当前目录。

答案2

首先,并非所有文件系统都使用...作为硬链接。这记录在 gnu find 手册中。在我的答案的其余部分中,我将忽略这些文件系统,因为它们不是为 unix 设计的,只会使事情变得复杂,而不会增加清晰度。出于同样的原因,我还将忽略根目录和挂载点。

.由于和,目录的链接数量永远不会少于两个..。子目录的数量等于链接数量减二。因此,您无法链接或取消链接目录,删除和使用文件而不是目录之前的文件也是rm -r如此。这两个系统调用在内核中使用完全不同的代码路径。statrmdirunlink

相关内容