为什么是 '。' Unix中的硬链接?

时间:2011-10-14 04:12:12

标签: unix filesystems directory relative-path inode

我已经看到很多解释为什么基于Unix的操作系统中空目录的链接计数为2而不是1.他们都说这是因为'。'目录,每个目录都指向自己。我理解为什么要有'。'的概念。对于指定相对路径很有用,但是在文件系统级别实现它会获得什么?为什么不只是让shell或系统调用让路径知道如何解释它?

那个'..'是一个真实的链接对我来说更有意义 - 文件系统需要将指针存储回父目录才能导航到它。但我不明白为什么'。'是一个真正的联系是必要的。它似乎也导致了实现中一个丑陋的特殊情况 - 你会认为你只能释放链接数小于1的inode使用的空间,但是如果它们是目录,你实际上需要检查链接数小于2.为什么不一致?

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)创建目录时,该功能

  1. 使用正确的内部结构
  2. 创建一个目录文件(带有一些inode编号)
  3. 在父目录中添加一个条目,将新目录的名称映射到这个新的inode(占其中一个链接),
  4. 在新目录中添加一个条目,映射字符串'。'到同一个inode(这说明了另一个链接)和
  5. 向新目录添加另一个条目,将字符串'..'映射到它在步骤(2)中修改的目录文件的inode(这说明了您在目录文件上看到的大量硬链接)其中包含子目录。)
  6. 最终结果是(几乎)唯一的特殊情况是:

    • open(2)函数试图通过阻止您打开目录文件进行写入来使自己更难在脚中射击。
    • mkdir(2)函数通过向新目录文件添加一些额外的条目('。'和'..')使事情变得简单易行,纯粹是为了方便移动文件系统。我怀疑文件系统在没有“。”的情况下运行良好。和'..',但使用会很痛苦。
    • 目录文件是被标记为“特殊”的少数几种文件类型之一 - 这实际上就是说open(2)之类的行为略有不同。请参阅stat(2)中的st_mode