为什么根目录“/”引用了它的“父”?

Jul*_*ann 6 unix filesystems

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

这种一致性的原因还是有更好的解释?

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

Foo*_*Bar 5

单一UNIX规范状态:

作为一种特殊情况,在根目录中,dot-dot 可能指的是根目录本身。

标准中没有说明原因。对于官方“为什么?” 答案,您可能需要直接询问 Ken Thompson。


Jez*_*ezC 5

文件系统遍历。

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

当您查看文件时,它位于一个目录中。您可以通过上升一个级别 (..) 并检查您所在目录的 inode 来询问该目录是什么。然后重复此操作,您可以建立您所在的位置。但是当你到达根部时,就没有了。只有“这里”。通过设置 '。' 和 '..' 为相同的值,你设置了一个唯一的信号,该文件系统中的其他目录不能有。它是根。

当您将文件系统挂载到另一个挂载点时 - 例如,您在另一个磁盘上有一个 /home 文件系统,您可以使用对根文件系统上的挂载点的引用来覆盖“..”。所以以前挂载的文件系统根目录有一个“.” 和 '..' 是相同的,现在有不同的值。

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

我认为Lions Commentary To The Unix Kernel version 6 中有相关文档。大约在第 84 页,它描述了如何处理挂载点。


har*_*ymc 3

有这样的POSIX 定义

3.144 空目录

一个目录,最多包含dotdot-dot的目录条目,并且在 dot-dot 中只有一个指向该目录的链接(除了它自己的点条目,如果存在的话)。

在所有文件命令的 POSIX 描述中使用不同的措辞重复此定义。
例如对于rmdir

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

上面对空目录的复杂定义显然是这个有趣约定的背后,其目的是避免规则的任何例外,甚至斜杠 (/) 也不例外。