我目前正在为浏览器游戏开发一个假文件系统。我最近实现了“..”和“.”文件夹,因此每个文件夹都有对其父文件夹的引用。然后我在终端中检查“/”是否也有这些文件夹。实际上,我很惊讶它有一个目录“..”,这显然是对它自身的引用。
这种一致性是否存在原因或者有更好的解释?
编辑: 我基本上是在寻找记录此事的文档。
答案1
答案2
答案3
文件系统遍历。
当您在 Unix 系统上查看文件名时,您正在查看一棵有根树。
当你查看文件时,它位于目录中。你可以询问该目录是什么,方法是向上一级 (..),并检查所在目录的 inode。然后重复此操作,就可以建立当前位置。但是当你到达根目录时,就没有向上的路径了。只有“这里”。通过将“.”和“..”设置为相同的值,你可以设置一个唯一的信号,而文件系统中的其他目录都无法拥有该信号。它是根目录。
当您将文件系统挂载到另一个挂载点时(例如,您在另一个磁盘上有一个 /home 文件系统),您会用对根文件系统上的挂载点的引用覆盖“..” 。因此,以前具有相同的“.”和“..”的挂载文件系统根现在具有不同的值。
让“.”和“..”重复相同的数据是一个重要且独特的信号,仅适用于树的顶部。这告诉遍历程序它们可以停止寻找父节点。
我认为Lions 对 Unix 内核版本 6 的评论. 大约在第 84 页,其中描述了如何处理挂载点。
答案4
我喜欢其他给出的答案,并想补充一点,使这个说法有意义的部分(至少对我来说)是目录实际上是特殊类型的文件。UNIX 中的任何“特殊”类型的文件都具有使其符合其“特殊”类型分类的必需属性。如果没有所有这些属性,系统可能无法识别它应该是什么,或者可能会误解它。您可以使用 vim 将目录视为文件。例如,如果您使用 vim 查看系统中的几乎任何目录,
$ vim ~
你会看到,这个“文件”中列出的第一个未注释的内容是“../”,也就是说,这个特殊文件中列出的第一个内容是父目录,正如你所期望的,它的父目录是“上一层”。但如果你尝试
$ vim /
您将在第一个未注释的行上看到它显示的是“./”而不是“../”。为什么会有这种差异,为什么它必须在这里?“/”必须有一个列出的“父文件”才能符合被识别为“目录”类型的特殊文件的要求。如果没有这个列表,那么“/”就好像指定了不同的父文件(即“/”特殊文件中首先出现的内容),我怀疑(但尚未证实)这会导致它的一个子文件被解释为其父文件,从而在文件系统中产生循环,即它不再是根文件系统,而是一个循环文件系统!换句话说,如果系统要始终将“目录文件”中的第一个条目解释为“此目录的父文件”,那么“/”必须有一个适当的第一个列表才能被正确解释。