我很久没有使用过硬链接了,直到一次面试中被问到这个问题,我才真正需要它们。我在这里读到了它们与符号链接的区别:硬链接和符号链接有什么区别?
是否有任何特殊原因导致设计没有同时满足符号链接的功能和硬链接的功能在里面相同链接文件?
您想要指向一个文件。好的,因此您从硬链接功能开始,以涵盖以下情况:文件名已更改或文件已移动. 如果硬链接由于指向文件系统之外或由于其他原因失败而无效有后备方案,要引用的文件的文件路径,换句话说,有一个符号链接。
因为操作系统用户最终想要的是只需有文件链接即可。
有什么可以阻止上述链接设计解决方案?
答案1
我不太明白你的意思。我认为你误解了硬链接的含义。首先,全部文件是硬链接。每一个都是。文件只是指向 inode 的链接。另一方面,符号链接是指向硬链接(指向路径)的链接。如何将两者结合起来?
更重要的是,功能非常不同。考虑一下:
$ echo "This is file" > file
$ ln -s file softlink
$ ln file hardlink
$ cat softlink
This is file
$ cat hardlink
This is file
$ rm file
$ echo "This is a different file" > file
$ cat softlink
This is a different file
$ cat hardlink
This is file
如上所示,删除硬链接指向的文件不会影响硬链接,因为硬链接指向的是 inode。另一方面,当目标被删除并重新创建时,软链接会发生变化,因为新文件现在指向不同的 inode。
此外,由于硬链接指向 inode 而不是文件系统路径,因此它们不能是相对的。通常,使用指向 的符号链接非常有用../../foo
。这样,我们可以将整个目录结构移动到其他位置并重命名任何我们喜欢的内容,但链接不会中断。因此,如果我们移动到其他目录,软链接将始终指向上foo
两级的 。但是,硬链接将仅指向创建时指向的任何 inode,移动目录不会影响它。有时这是我们想要的,有时不是。拥有这种多功能性非常有用。
答案2
我觉得你对这个词感到困惑“关联”在“硬链接”/“软链接”尽管表面上命名对称,但那是完全不同的事情。
软链接:
如果您有微软背景,那么这样说可能更容易理解:软链接与快捷方式非常接近。它是一个(几乎)常规文件,其中包含路径名。
唯一的区别在于,在 Unix 上,操作系统有一些自动重定向应用程序的魔法。也就是说,当应用程序
open()
访问文件时,操作系统会检查S_IFLNK
文件上的模式标志 - 如果已设置,则意味着它仅包含另一个文件的路径,操作系统会透明地将调用重定向到该路径。硬链接:
硬链接只是一个技术术语“文件名”。 当你“创建硬链接”您只是为同一个文件添加了第二个名称。整个工作流程大致如下:
- 当您创建一个文件时,它会自动获取第一个文件名。
- 如果愿意,您可以添加其他文件名。
- 在 Unix 上,你无法真正删除文件。该
rm
命令仅删除文件名。当你知道它执行的实际操作称为unlink()
英 - 每当文件不再有任何文件名时,它就会被删除。(*)
附注:目录始终至少有两个文件名:一个在其父目录中,一个在其自身中(
.
)。此外,如果目录有子目录,则它将在每个子目录中有一个名为 的附加硬链接..
。您可以通过运行来查看文件名/硬链接数
ls -l
。输出中的第二列。
(*):如果某个进程正在使用该文件,则删除将被推迟,直到不再使用该文件。与此同时,您确实有一个没有名称的文件,您无法查看或访问它。
答案3
我发现有以下缺点:
- 有了硬链接,文件的“原始”路径就不存在了,也就是说,你无法区分文件和它的链接。我经常使用链接作为文件的快捷方式,这些文件位于有序的嵌套目录结构中,以简化导航,但我仍然希望能够查找文件的确切存储位置(因为其原始路径包含信息)。
- 对于不太熟练的用户来说,这种回退可能会让他们感到困惑。如果你习惯了所有东西都是硬链接,而且文件本身就是一个链接,那么你有时可能会删除原始位置的文件,因为你知道链接会将数据保留在驱动器上。现在,如果回退到软链接,你将删除数据。当然,软件可能会发出警告,但对许多人来说,这可能会增加困惑。
总的来说,我认为向用户隐藏根本不同的东西不是一个好主意。在大多数情况下,软链接都可以。根据我的经验,硬链接主要用于备份。例如,dirvish
使用它们。
答案4
在我开始使用 Unix 之前,我使用过 AmigaOS,它有链接,既有符号链接的某些方面,也有硬链接的某些方面。我从来没有真正理解过它们是如何运作的。
然后我开始使用 Unix 系统(后来是 Linux)。我发现符号链接和硬链接本身都很容易理解。直到今天,我仍然不明白 AmigaOS 中用于链接的混合结构。
从最小意外原则来看,我发现符号链接和硬链接之间的区别是一种很好的构造。它们都不会带来任何意外。
但这两种构造有很大不同。它们最大的共同点是都可以使用ln
命令行工具创建。
我无法想象如何将两者合并为一个统一的概念而不会使其变得非常复杂。这将是反对改变设计的主要论点。最好将每个功能分开,每个功能都易于理解,而不是一个复杂的功能。
反对这一改变的另一个理由是,目前有很多软件设计用于处理符号链接和硬链接。所有这些软件都无法处理混合链接。