我认为mkdir ~/a
要么是两个,要么是三个:
- 其所在目录有 1 个条目 (
~/a
) - 本身有 1 个条目 (
cd a && ls .
) - 和/或再次为自己添加 1 个条目 (
cd a && ls ..
)
有人可以澄清一下这是两个还是三个吗?
答案1
在空目录中:
% stat .
File: `.'
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fe04h/65028d Inode: 537317737 Links: 2
Access: (0750/drwxr-x---) Uid: ( 1000/stribika) Gid: ( 100/ users)
Access: 2011-02-22 08:47:20.935036074 +0100
Modify: 2011-02-22 08:47:20.935036074 +0100
Change: 2011-02-22 08:47:20.935036074 +0100
Birth: -
% mkdir foo
% stat .
File: `.'
Size: 16 Blocks: 0 IO Block: 4096 directory
Device: fe04h/65028d Inode: 537317737 Links: 3
Access: (0750/drwxr-x---) Uid: ( 1000/stribika) Gid: ( 100/ users)
Access: 2011-02-22 08:47:20.935036074 +0100
Modify: 2011-02-22 08:47:57.465036072 +0100
Change: 2011-02-22 08:47:57.465036072 +0100
Birth: -
% stat foo
File: `foo'
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fe04h/65028d Inode: 509269 Links: 2
Access: (0750/drwxr-x---) Uid: ( 1000/stribika) Gid: ( 100/ users)
Access: 2011-02-22 08:47:57.465036072 +0100
Modify: 2011-02-22 08:47:57.465036072 +0100
Change: 2011-02-22 08:47:57.465036072 +0100
Birth: -
正如您所看到的,有 2 个指向空目录的链接。当我在其中创建一个新目录时,链接计数增加到 3。此外,还有 2 个指向新目录的链接。总共有 3 个新链接。
这是因为每个目录都有一个指向其自身 (.) 及其父目录 (..) 的链接。
答案2
在最初的 Unix 实现中,为了保持内核中的文件系统代码简单,目录操作程序做了一些额外的工作:特别是为inmkdir /parent/a
创建了一个条目,加上一个名为in 的条目(指向其自身)和一个名为in 的条目(指向1)。a
/parent
.
a
a
..
a
/parent
很快, 和 朋友的代码mkdir
无论如何都转移到了内核中,但是文件系统格式仍然具有显式的.
和..
条目,文件系统遍历代码通过名称找到(而不是在每个目录中有两个特殊格式的指针)。
如今,一些(大多数?)文件系统会伪造它:目录实际上在磁盘上没有.
条目,它们是由驱动程序生成的。..
然而,从用户的角度来看,这是透明的。目录的链接计数仍然是二加上子目录的数量(父目录中的条目、目录自己的.
以及每个子目录的..
)。特别是,一个空目录的链接计数为 2(即文件系统中有两个条目指向它),但创建它会创建三个条目(第三个条目..
指向父目录)。
1
通过引用,而不是通过名称。因此,如果您重命名/parent
,则无论它移动到文件系统结构中的哪个位置,a
都会..
继续指向a
其父目录。