我已经看到很多解释为什么基于Unix的操作系统中空目录的链接计数为2而不是1.他们都说这是因为'。'目录,每个目录都指向自己。我理解为什么要有'。'的概念。对于指定相对路径很有用,但是在文件系统级别实现它会获得什么?为什么不只是让shell或系统调用让路径知道如何解释它?
那个'..'是一个真实的链接对我来说更有意义 - 文件系统需要将指针存储回父目录才能导航到它。但我不明白为什么'。'是一个真正的联系是必要的。它似乎也导致了实现中一个丑陋的特殊情况 - 你会认为你只能释放链接数小于1的inode使用的空间,但是如果它们是目录,你实际上需要检查链接数小于2.为什么不一致?
答案 0 :(得分:2)
为什么不只是让shell知道如何使用shell或系统调用 解释它?
透明度。如果文件系统执行它,那么应用程序(以及无数的系统调用)不必对“。”执行任何特殊操作。喜欢“哦,用户想要当前目录!”。 cwd
及其意义的概念在FS层面整齐地存储起来。
它似乎也导致了一个丑陋的特殊情况 实现 - 你会认为你只能释放使用的空间 通过链接数小于1的inode,但如果它们是 目录,您实际上需要检查链接数是否小于2.
这不是特例。 Unix中的所有文件都有许多链接。检查unlink
的任何文件“这是最后一个链接吗?”。如果是的话,它会得到印章。如果没有,它就会徘徊不去。
答案 1 :(得分:1)
(嗯:以下现在有点像史诗......)
unix文件系统上的目录设计(讽刺的是,通常是但不一定附加到unix操作系统)代表了一种奇妙的洞察力,实际上减少了所需的特殊情况的数量。
'directory'实际上只是文件系统中的一个文件。文件系统中文件的所有实际内容都在 inode 中(根据您的问题,我可以看到您已经知道其中的一些内容)。磁盘上的inode没有任何结构 - 它们只是一大堆字节数字,在磁盘上像花生酱一样传播。这是没有用的,对任何一丝不苟的人来说确实是令人厌恶的。
仅特殊inode是inode编号2(出于传统原因,不是0或1); inode 2是一个目录文件:根目录。当系统挂载文件系统时,它'知道'它必须读取inode 2才能自己启动。
目录文件只是一个文件,其内部结构可供opendir(3)和朋友阅读。您可以在dir(5)中看到其内部结构(取决于您的操作系统);如果你看一下,你会发现目录文件条目几乎没有关于该文件的信息 - 这些都在文件inode中。关于这个文件的一些特别之处是,如果你试图用允许写入的模式打开一个目录文件,open(2)函数将会出错。各种其他命令(仅选择一个示例,hexdump
)将拒绝以正常方式使用目录文件,因为这可能不是您想要做的(但这是他们的特殊情况,而不是文件系统)。
硬链接只不过是目录文件地图中的条目。您可以在此类映射中包含两个(或更多)条目,这两个条目都映射到相同的inode编号:因此该inode具有两个(或更多)硬链接。这也解释了为什么每个文件至少有一个“硬链接”。 inode有一个引用计数,它记录文件系统中某个目录文件中提到的inode的次数(这是你在ls -l
时看到的数字)。
好的:我们现在已经到了这一点。
目录文件是字符串('文件名')到数字(inode编号)的映射。这些inode编号是该目录中“文件”的inode编号。 “目录”中的文件可能包含其他目录文件,因此它们的inode编号将在目录中列出的文件中。因此,如果您有文件/tmp/foo/bar
,则目录文件foo
包含bar
的条目,将该字符串映射到该文件的inode。目录文件/tmp
中还有一个条目,用于目录文件foo
,它位于目录/tmp
中。
使用mkdir(2)创建目录时,该功能
最终结果是(几乎)唯一的特殊情况是:
st_mode
。