当目录的硬链接数变为 0 时,是否删除目录?
一个目录总是至少有 2 个硬链接,因为.. 当rm -r一个目录时,它是否将硬链接的数量从 2 减少到 0,而不是 1?
目录的硬链接数可以是1吗?
谢谢。
Ran*_*832 11
任何在传统设计的 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 甚至当.和..消失了。
*这包括正常打开的描述符、内存映射部分(包括例如执行二进制文件和共享库)和进程当前目录。
hil*_*red 10
首先,并非所有文件系统都使用.和..作为硬链接。这在 gnu find 手册中有记录。在我的其余答案中,我将忽略这些文件系统,因为它们不是为 unix 设计的,只会使事情复杂化而不增加清晰度。出于同样的原因,我也将忽略根目录和挂载点。
链接到一个目录的数量超过两个,因为从来没有少.和..。子目录数等于链接数减二。正因为如此,你不能链接或解除目录,因此rm -r将stat删除和使用前的文件rmdir,而不是unlink在目录上。这两个系统调用在内核中使用完全不同的代码路径。