1

我想知道为什么每个文件都有 1 个指向自身的链接。

我会尽量说得更清楚。

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

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

4

3 回答 3

2

因为第一个硬链接没有什么特别之处(软链接不同,它们实际上只是包含文本目标的特殊文件)到一个文件,它只是一个指向它后面的inode的目录条目。

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

所以不要认为文件是一个目录条目,其他文件链接到它。想想文件中的数据,而不是文件中的数据,有尽可能多的目录条目来引用它。当您将目录条目硬链接a到现有的b时,您实际上是将其链接到后面 b的 inode ,并且它们在任何意义上都是平等的。只有当最终的硬链接断开时,数据才会被破坏。

于 2020-06-23T10:01:57.673 回答
1

您看到的文件名是指向代表文件的底层对象的硬链接,具有 0 链接的文件系统会自动删除。

于 2020-06-23T10:02:20.263 回答
0

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

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

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

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

ln foo bar

您正在为文件创建别名foo,现在也称为bar。如果您现在制作目录列表,您将看到两个文件条目都包含2在链接数字段中。更多信息,如果你执行

ls -li foo bar

您将看到第一列,将两个文件的 inode 编号(这是文件系统中文件的唯一 ID)显示为同一个 inode...如果您将权限更改为其中一个链接,您将看到另一个文件名他的权限也改变了......这是因为两个文件名都是同一个文件的别名

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

于 2020-06-27T15:00:16.800 回答