文件的链接

The links to a file

我想知道为什么每个文件本身都有 1 link。

我会尽量说得更清楚。

通过从 bash 中插入命令“ ls -l ”,您最终会得到一个文件列表,每个文件前面都有不同的数据,分为几列。文件的 link 数量在第三列。谁能解释一下为什么文件将该信息设置为 1 而不是 0?

我明白为什么目录有两个,如果你探索一个,你会发现“.”和“. .”子目录,前者指向目录本身,而后者指向前一个目录,但是该文件不能包含“.”子目录,因为它是一个文件,所以它不应该是 0 吗?

因为第一个硬link没有什么特别的(软link是不同的,它们实际上只是包含文本的特殊文件target) 到一个文件,它只是一个目录条目,引用它后面的 inode

这是决定将数据(索引节点)与数据引用(目录条目)分开的结果。

所以不要认为该文件是一个目录条目,其他文件 link 被添加到它。想想文件中的数据,而不是文件中的数据,您可以根据需要引用尽可能多的目录条目。当你硬 link 目录条目 a 到一个现有的 b 时,你实际上是 link 将它 放在 后面的 inode b,并且它们在任何意义上都等于。数据只有在最终硬 link 断开时才会被销毁。

您看到的文件名很难 link 表示文件的底层对象,文件系统会自动删除具有 0 link 的文件名。

您误解了指向文件 inode 的 link 的数量,事实上 有一个 link pointint对自身(见下文)。

只需考虑 link 的可能性... link 是目录中的一个条目,它将名称与 inode 相关联。 inode 表示存储在文件(或目录)中的所有管理数据,并存储诸如权限位、上次读取、上次写入或上次 inode 更改的日期、指向文件数据块的指针等内容。

每个 inode 中有一个整数字段,反映指向它的 link 的数量(这就是 ls 显示的内容)。出于效率原因,这是必需的,因为它是冗余信息。只需浏览整个文件系统,我们就可以确定指向同一 inode 的目录条目的数量......但这样做是不切实际的,因此每次 linked 节点时都会维护 link 计数或未linked。所以下一个问题是:为什么指向文件 inode 的目录条目数是必需的?有一个簿记的原因。为了检测它何时达到零,因此,内核保持 links 的数量指向一个 inode,这样它就可以释放属于 inode 的所有块和 inode 本身,以便恢复上次删除 (unlinked) 文件后的数据(当计数器降为零时)

通常情况下,一个文件至少有一个 link,但它可以有更多。如果你执行这样的命令:

ln foo bar

您正在为文件 foo 创建一个 别名 ,现在也称为 bar。如果您现在列出您的目录,您将看到两个文件条目在 link 字段的数量中都有 2。更多信息,如果您执行

ls -li foo bar

您将看到第一列,将两个文件的索引节点号(这是文件系统中文件的唯一 ID)显示为相同的索引节点...如果您将权限更改为 links,你会看到另一个文件名他的权限也改变了...这是因为两个文件名都是别名 同一个文件。

关于我的第一段,多个 link 与指向自身不同。每个目录都有一个条目指向目录本身的目录索引节点。这是每个目录都有的条目.(这个条目允许你执行不带参数的ls命令,例如当你不指定参数时,ls命令使用. 作为要列出的目录),这使得目录始终具有 2 作为最小值(您观察到的文件的 1,加上 link . 目录每个目录都有,对于那个数字(检查这个,你会看到这是 unix 系统的一个不变量)目录在它的 inode 中有 2 + number_of_subdirectories(一个用于父目录中指向目录本身,一个用于目录本身的目录条目 .,一个用于每个子目录的条目 .. 父目录,在该目录的子目录中)检查数字,它不会失败. 对于文件来说,是一个文件可以拥有的 links(或别名)的数量。当你列出一个目录时,你看不到带有 0 links 的文件,那些文件,案例现有的,正在由kerne处理l、在擦除它们(释放它们使用的块)的任务中,目录不能有不同的别名或名称作为文件,以保存层次目录结构,只有[=的两个例外16=] 和 .. 是允许的,它们由内核维护(和强制执行)。