为什么根目录 '/' 有对其“父级”的引用?

为什么根目录 '/' 有对其“父级”的引用?

我目前正在为浏览器游戏开发一个假文件系统。我最近实现了“..”和“.”文件夹,因此每个文件夹都有对其父文件夹的引用。然后我在终端中检查“/”是否也有这些文件夹。实际上,我很惊讶它有一个目录“..”,这显然是对它自身的引用。

这种一致性是否存在原因或者有更好的解释?

编辑: 我基本上是在寻找记录此事的文档。

答案1

有这个POSIX 定义

3.144 空目录

最多包含以下目录条目的目录点点,并且恰好有一个链接(除了其自身的点条目(如果存在)),点点滴滴

此定义在所有文件命令的 POSIX 描述中以不同的措辞重复出现。
例如删除目录

空目录的定义是最多包含点和点-点的目录条目。

上述空目录的复杂定义显然是这个有趣约定的背后原因,其目的是为了避免任何例外,甚至斜线(/)。

答案2

单一 UNIX 规范状态:

作为一个特例,在根目录中,点点可能指的是根目录本身。

标准中没有说明原因。要得到正式的“为什么?”答案,你可能需要直接问 Ken Thompson。

答案3

文件系统遍历。

当您在 Unix 系统上查看文件名时,您正在查看一棵有根树。

当你查看文件时,它位于目录中。你可以询问该目录是什么,方法是向上一级 (..),并检查所在目录的 inode。然后重复此操作,就可以建立当前位置。但是当你到达根目录时,就没有向上的路径了。只有“这里”。通过将“.”和“..”设置为相同的值,你可以设置一个唯一的信号,而文件系统中的其他目录都无法拥有该信号。它是根目录。

当您将文件系统挂载到另一个挂载点时(例如,您在另一个磁盘上有一个 /home 文件系统),您会用对根文件系统上的挂载点的引用覆盖“..” 。因此,以前具有相同的“.”和“..”的挂载文件系统根现在具有不同的值。

让“.”和“..”重复相同的数据是一个重要且独特的信号,仅适用于树的顶部。这告诉遍历程序它们可以停止寻找父节点。

我认为Lions 对 Unix 内核版本 6 的评论. 大约在第 84 页,其中描述了如何处理挂载点。

答案4

我喜欢其他给出的答案,并想补充一点,使这个说法有意义的部分(至少对我来说)是目录实际上是特殊类型的文件。UNIX 中的任何“特殊”类型的文件都具有使其符合其“特殊”类型分类的必需属性。如果没有所有这些属性,系统可能无法识别它应该是什么,或者可能会误解它。您可以使用 vim 将目录视为文件。例如,如果您使用 vim 查看系统中的几乎任何目录,

$ vim ~

你会看到,这个“文件”中列出的第一个未注释的内容是“../”,也就是说,这个特殊文件中列出的第一个内容是父目录,正如你所期望的,它的父目录是“上一层”。但如果你尝试

$ vim /

您将在第一个未注释的行上看到它显示的是“./”而不是“../”。为什么会有这种差异,为什么它必须在这里?“/”必须有一个列出的“父文件”才能符合被识别为“目录”类型的特殊文件的要求。如果没有这个列表,那么“/”就好像指定了不同的父文件(即“/”特殊文件中首先出现的内容),我怀疑(但尚未证实)这会导致它的一个子文件被解释为其父文件,从而在文件系统中产生循环,即它不再是根文件系统,而是一个循环文件​​系统!换句话说,如果系统要始终将“目录文件”中的第一个条目解释为“此目录的父文件”,那么“/”必须有一个适当的第一个列表才能被正确解释。

相关内容