当目录的硬链接数变为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
在这些历史系统上,误用以unlink
root 身份运行的程序的调用、遇到与rmdir
或 的竞争条件mv
,或者在当前目录已被删除的进程中创建文件(现代系统阻止这种情况),可能会导致悬空文件或目录其硬链接计数大于 0 但不存在于目录树中。这种情况由 检测到dcheck
,并且仍然是检查之一,fsck
因为它在大多数文件系统上在物理上仍然是可能的。
顺便说一句,文件系统不需要将目录(包括.
和..
)实现为具有硬链接的普通文件。在这些文件系统上,目录的硬链接计数将始终报告为0
(但当然,它在父目录中的存在符合“引用计数”1)。
已删除目录的行为(例如,当由已打开该目录或将其作为当前目录的进程检查时)以及目录的“链接计数”的确切含义未指定。例如,在 Mac OS X 上,它将报告硬链接计数为 2,即使它没有真正的硬链接。即使.
和..
未出现在列表中,该目录也可以打开并stat
可以使用名称.
或进行调用..
。在 Linux 上,链接计数为 0,但.
同样..
仍然有效。
Mac OS X 还报告了全部文件目录中的链接计数,而不仅仅是子目录的数量。但即使当.
和..
消失时,它仍然是 2 。
*这包括正常打开描述符、内存映射部分(包括例如执行二进制文件和共享库)以及进程当前目录。
答案2
首先,并非所有文件系统都使用.
和..
作为硬链接。这记录在 gnu find 手册中。在我的答案的其余部分中,我将忽略这些文件系统,因为它们不是为 unix 设计的,只会使事情变得复杂,而不会增加清晰度。出于同样的原因,我还将忽略根目录和挂载点。
.
由于和,目录的链接数量永远不会少于两个..
。子目录的数量等于链接数量减二。因此,您无法链接或取消链接目录,删除和使用文件而不是目录之前的文件也是rm -r
如此。这两个系统调用在内核中使用完全不同的代码路径。stat
rmdir
unlink