雁过留声 发表于 2024-10-30 23:57:55

初识Linux · 软硬链接

目次
前言:
见见软硬链接
软硬链接的特征
软硬链接的用处
前言:

前文我们介绍了磁盘系统的理解,并且基于磁盘系统对文件系统的整体框架有了一个简单的理解,我们都是通过“想要见地没有打开的文件”这个话题引出来了以上的两个主题,紧随其后的,是软硬链接部分,对于软硬链接部分,我们仍然从是什么 为什么 怎么做来了解这部分的知识点。
那么,进入主题吧!
见见软硬链接

我们通过指令:
   ln -s file_target.txt file_soft.link
天生一个链接文件,链接文件指向的是file_target.txt。那么这个链接是软链接照旧硬链接我们先不管。
https://i-blog.csdnimg.cn/direct/d188aee677e34b26a9f7de39cc1ad042.png
创建好了链接之后,我们往文本里面写入一段Hello world。写入成功之后,我们cat两个文件,发现两个文件都可以打开。 
https://i-blog.csdnimg.cn/direct/7bc6faca99974efc9342e00d712a00b1.png
此时我们执行指令ll:https://i-blog.csdnimg.cn/direct/912b956f59c14828b656d8c4ad469471.png
可以发现file_soft.link是指向了file_target.txt文件的,那么当我们删除了file_target.txt之后:
https://i-blog.csdnimg.cn/direct/d9ce1634da4543f2b64af98d17c5ab6c.png
可以发现file_soft.link这一行就变红了,此时我们尝试打印:
https://i-blog.csdnimg.cn/direct/56565045c10c417ab21cec94e1f6c75e.png
就报错了,说是没有这个文件。
那么我们重复刚才的操作,重新创建一个文件,并用-s选项链接一下:
https://i-blog.csdnimg.cn/direct/f032e262fd7045d3a050ca784fe47214.png
那么我们试试用上篇文章的知识-inode?
https://i-blog.csdnimg.cn/direct/f18bc8fe9fec4dc6a7c01bd43a68124c.png
发现它们的inode不是一样的,所以它们是两个独立的文件,而file_soft.link指向的是文件file_target.txt,当文件file_target.txt删除之后,指向失效了,所以bash历程报错。
以上通过选项-s我们可以知道,其实ln -s选项创造的链接就是软毗连,因为柔软的英文是soft呗。以上是软毗连。
那么我们不妨简单看看硬链接:
https://i-blog.csdnimg.cn/direct/813710b3e7ca467f98dc5d2a66a8b219.png
我们不带s选项,形成的就是硬链接,所以ln默认形成的是硬链接,此时打印是和软毗连一样的:
https://i-blog.csdnimg.cn/direct/c973d7255c0c4805926eaa1410db03b9.png
那么同理,我们先ll一下:
https://i-blog.csdnimg.cn/direct/ebfe545e732b4eb2bf8e0de902ed3ae5.png
惊讶的发现,inode居然是一样的?
并且发现权限后面的数字还和软毗连有点不一样?
那么以上的种种发现,我们进入第二阶段。
软硬链接的特征

我们先聊聊软链接,其实通过上文的介绍,我们已经了解了软毗连的部分特性。
软链接自己是独立的文件,假如删除了链接指向的文件,链接属性就失效了,而我们在windows系统上也能得到类似的效果,其实就是windows里面的快捷方式:
https://i-blog.csdnimg.cn/direct/310930367f26400486af7d8b71445dc3.png
像这样,我们点开对应的快捷方式,里面对应的目标,就是属性对应的文件位置,这其实就是一种软链接,而软链接这个文件的内容就是目标位置的路径的字符串。
接下来我们谈谈硬链接:
https://i-blog.csdnimg.cn/direct/695b234e167b4a66b8e2f1c31f2fdd64.png
首先第一个点,硬链接是一个独立的文件吗?
那肯定不是了,因为硬链接不具有独立的inode number,因为它的inode number是来源于file_target.txt的,这是硬链接的第一个特征。
第二个点,后面的数字1 2是什么意思?我们不妨先尝试删除目标文件试试:
https://i-blog.csdnimg.cn/direct/a3de8a6e05a642e59bc4ba390614e90c.png
删除了之后,我们发现照旧可以正常的打印,然后我们重新ll -i一下:
https://i-blog.csdnimg.cn/direct/ed91de14d0ef4e4284ec8f63dcda3072.png
可以发现权限后面的数字已经变成了1,那么我们联合C++11部分的智能指针部分,我们也能大差不差的联想到似乎是引用计数?
答案就是的!这个数字代表的是硬链接数,相当于硬链接数减到0,才会在内核里面free掉struct file对象。
那么,什么是硬链接呢?
硬链接就是在指定目次下,创建新的文件名和inode number的映射关系!!
但是这样我们理解并不深刻,既然Linux中一切皆文件,那么我们想看看目次这个文件对应的硬链接呢?
https://i-blog.csdnimg.cn/direct/df4832bc6cc949149dc275bf2bc884a1.png
我们惊讶的发现,test_link的硬链接数居然是2?
凭什么?我们创建这个目次以来,就没有创建过链接啊!!
那么我们看看该目次里面有什么呢?
https://i-blog.csdnimg.cn/direct/c9beea9fd21c4cdf9862e3d021873685.png
你看这个. 我们在最开始学习目次的时间,就知道了这个.是用来表示当前目次的!!那么既然是指向的当前目次,那么这是不是一种硬链接呢?当然是的!!
所以目次的默认硬链接数是2。
软硬链接的用处

讨论软硬链接的用处之前,我们必要讨论一个问题:
我们可以有几种方式找到一个文件?
以我们目前学的点来看,目前是两种:
第一是通过路径,第二就是直接找到该文件对应的inode。
那么对于软链接来说,软链接使用的方式就是第一种,直接通过路径,因为软链接这个文件里面的内容就是目标路径的字符串,所以一般对于软链接来说,巨细都是1.
那么对于硬链接来说,硬链接使用的方式就是直接找到文件对应的inode,因为硬链接自己就不是一个独立的文件,拥有的inode都是已经创建好的。
那么上文提到,硬链接就是文件备份,并且我们知道了目次默认是有两个硬链接的,一个是目次自己,一个是目次里面的. 指向的就是当前目次,但是我们还知道硬链接里面还有..
对于..来说,我们知道的是它指向的是上级目次,所以:
https://i-blog.csdnimg.cn/direct/192e6758adba49bcb023a9e8464b86f0.png
https://i-blog.csdnimg.cn/direct/c8d380bb21e440188a2ac26d386c7297.png
因为我们在目次里面创建了的照旧目次,所以..指向的就是上级目次,即test_link的硬链接数就是3.
所以我们要得到一个目次里面有多少个目次,我们可以直接用该目次的硬链接数 - 2.
那么我们是否可以给目次创建一个硬链接呢?
https://i-blog.csdnimg.cn/direct/31f8d81632394083bddd15097f9945b1.png
这是不行的,但是软链接是可以的。
但是为什么不能给目次创建硬链接呢?
这是为了防止形成路径闭环。
假如在 /home/user 下创建一个硬链接指向 /home/user,那么通过这个硬链接就可以返回到这个目次,在遍历文件系统时就会形成无穷循环。
假设一条路径是/d1/d2/d3/hard-link,对d2创建硬链接hard-link,这会导致用户构建了一个环路路径的问题,假如输入指令find /d1/d2/ -name test.c,在d2目次里找test.c文件,指定在d2目次去找,假设递归式的找,他找到了d3里面的hard-link又把它倒到d2,这个时间他就出现了环路问题,导致出不来了,问题就解决不了了。
对于链接部分,介绍到了这里。
那么此时,你对 ./a.out的理解是否加深了呢?
感谢阅读!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 初识Linux · 软硬链接