Linux硬链接混乱

Wei*_*wei 6 linux hardlink

我对 Linux 硬链接感到困惑,

我在我的 Ubuntu 机器上用这个命令创建了一个硬链接,

ln f1 f2
Run Code Online (Sandbox Code Playgroud)

所以f2应该是f1的硬链接,但是为什么我用emacs改了f2并保存了f2,f1根本没变。我的理解是 f1 应该有我对 f2 所做的任何更改。

Ran*_*son 8

我做了一些测试并弄清楚发生了什么。首先,命令 ls -li 在第一列中显示 inode 编号,指向同一文件的两个硬链接将具有相同的 inode 编号:

$ echo hi > f1
$ ln f1 f2
$ ls -li
total 8
1646595 -rw-r--r-- 2 randy randy 3 2011-06-18 06:50 f1
1646595 -rw-r--r-- 2 randy randy 3 2011-06-18 06:50 f2
Run Code Online (Sandbox Code Playgroud)

文件 f1 和 f2 的 inode 编号均为 1646595,它们是指向相同数据的硬链接。我使用 emacs 编辑 f1 并保存:

$ ls -li
total 12
1646597 -rw-r--r-- 1 randy randy 9 2011-06-18 06:51 f1
1646595 -rw-r--r-- 2 randy randy 3 2011-06-18 06:50 f1~
1646595 -rw-r--r-- 2 randy randy 3 2011-06-18 06:50 f2
Run Code Online (Sandbox Code Playgroud)

现在,f1~和f2 具有相同的inode 编号,f1 具有新的inode 编号。

保存时emacs所做的将f1重命名为f1~并创建了一个新文件f1。f1~ 仍然硬链接到 f2,而 f1 作为一个新文件没有链接到其他任何地方。

我不知道 emacs 中是否有更改此行为的设置。

  • 通常情况下,写入现有文件的应用程序不会直接写入它,而是写入一个新文件并重命名。事实上,这通常是可取的,因为它更安全:如果出现问题(磁盘空间不足、断电等),文件不会被截断。这种行为的另一个优点是硬链接可用于制作文件或整个目录树的“写时复制”副本(目录不是硬链接,只有里面的文件)。 (2认同)