软硬连接
1、 软连接
1.1、创建方法
bash
ln -s test.exe link-test.exe

1.2、深入理解
观察test.exe与建立的软链接文件的属性细节:

我们发现,link-test.exe的inode number与test.exe不一样,说明他们是两个不同的文件。
作为一个独立的文件,软链接link-test.exe的内容存储的是test.exe的路径,那么访问软链接link-test.exe就能访问到test.exe本身。
1.3、使用价值
软链接存储的是目标文件的路径,即软链接可以当作windows下的快捷方式来使用。
软链接还有一个价值:
- 用软链接文件链接一个库文件。未来这个库文件需要更新的时候,我们只需换上新的库文件,然后设置库文件新的软链接方式,但是软链接的文件名不变。这样一来,就算更新了库文件,我们也不需要跟着修改与库文件名相关的配置文件。
2、硬链接
2.1、创建方式
相比软链接,硬链接的创建只需去掉-s选项:
bash
ln test.exe link-test.exe

2.2、深入理解
硬链接文件,与test.exe的inode number是一样的。也就是说,它们是同一个文件。
图中,"文件权限"与"拥有者"之间的数字,由"1"变为了"2"。这个数字就是硬链接数,表示一共有多少个文件名映射到同一个文件本身,相当于我们之前在C++的智能指针中学习的"引用计数"。
我们也可以理解为,link-test.exe是文件test.exe的"别名"。
如果硬链接数大于1时,删除文件只会让引用计数减一;只有当硬链接数等于1时,再删除文件就真的把所有数据都删除了。
2.3、使用价值
硬链接的使用价值之一,就是通过"引用计数"的方式,备份文件,藏到系统中的一个隐蔽的地方,而不需要真的拷贝文件。
我们也可以看一个有意思的实验。
创建目录,执行ll -i,我们可以看到文件.的硬链接数为2,这是因为该目录有本来的名字,和.:

再创建一个目录,该目录的硬链接数就变为了3,这是因为新创建的目录中,..对应的文件也是该目录,即该目录此时有了三个名字:

这三个名字,体现了硬链接的实际应用。
3、硬链接的限制
Linux中,目录文件可以进行软链接,但不可以进行硬链接。

软链接文件,是独立于目标文件的另外一个文件,当然inode number也不一样,对目录进行软链接没有问题。
硬链接文件的文件名,与目标文件的文件名,共同指向同一个文件inode number。当OS或者用户想要遍历整个目录的时候,遍历到硬链接文件的时候,又返回到目标文件处重新遍历。这就会导致整个目录中的"环型遍历",相当于陷入了死循环。
所以,Linux开发者制定了规定,不允许用户使用硬链接连接目录文件。
当然,目录文件中的. ..使用了硬链接技术连接目录文件,这是为了实现"当前目录"和"上级目录"这两个概念。未来开发过程中若涉及遍历目录的操作,开发者之间应共同约定 ,绕过. ..这两个文件。