深入理解软硬链接

Posted 做1个快乐的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解软硬链接相关的知识,希望对你有一定的参考价值。


  软硬链接不管是在Linux系统还是Windows系统中都无处不在,我们windows下,桌面的各种应用图标就是一种链接,那这种链接是软链接呢?还是硬链接呢?那我们把QQ的图标删除之后,QQ是不是就不能再使用了,这些都与链接有关,本篇文章小编将详细介绍软硬链接的区别和他们的创建。

1. 软链接的创建

  软链接的建立命令是ln -s,如下图,我们目录下只有test.c这一个文件,我们尝试创建一个软链接来看看,ln -s test test.c,该命令行就创建了一个名为test的软链接文件,用后者test.c指向前者test,也就是说用后者链接前者。此时我们就看到生成了一个test文件,并且test文件指向test.c,这个就叫做软链接。

2. 硬链接的创建

  ln不带任何选项建立的链接叫做硬链接,同样我们执行命令:ln test.c TEST,此时即建立了硬链接,TEST就是test.c的硬链接。

3. 软硬链接的区别(inode、硬链接数)

3.1 软链接inode

  我们下面从inode编号和硬连接数来讲解软硬链接的区别,我们使用-i命令可查看文件的inode编号,如图上面软链接的创建过程,我们黄框标起来的是inode编号,红框标起来的就是我们的硬连接数,因我们是建立的软链接,所以硬连接数始终为1,我们观察inode编号,我们创建了test文件指向test.c,这个test就是test.c的软链接,我们观察这两个文件的inode,发现是不一样的
  因为一个文件对应一个inode编号,所以软链接形成的文件是一个独立的文件,他有自己独立的inode,有自己独立的数据,这个软链接test的内容相当于保存了test对应的路径,这个特别像windows中的快捷方式。

  我们通过cat打印两个文件的内容,发现两个文件的内容也是一模一样的,那么当软链接一个可执行程序呢?我们发现两个文件都是可以执行的,且运行结果一样。

图一:可执行程序图
图二:运行结果

3.2 硬链接inode和硬链接数

  还是上图的硬链接,我们可以看的它的硬链接数为2,着我们应该可以理解,因为我们确确实实创建了一个硬链接文件TEST,所以硬链接数为2。这里值得注意的是,两个文件的inode是一样的,说明硬链接并没有创建新的文件,因为新文件的创建必定会有信inode编号的生成。

  当我们新建一个硬链接文件,硬链接数变为1,那么当我们删除之后,硬链接数会有什么变化呢?我们通过实例来观察。

  我们通过示例观察到,当我们删除test.c时,对硬链接文件TEST的影响无非就是硬链接数减1,还是可以正常打印文件中的内容,但是我们的软链接文件test,后面指向的文件一直在闪烁,并且其文件中的内容无法打印。

  这里我们不禁疑问,如果是可执行程序呢?如果删除了源链接文件,创建的软硬链接文件还可以执行吗?我们接下来用实际行动表达结果。如图中,exe是我们的源文件,exe-h是创建的硬链接文件,exe-s是我们创建的软链接文件,我们现在将exe文件删除,查看结果。同样,硬链接文件可以正常执行,软链接文件报错。

图一:可执行程序图
图二:运行结果

3.3 总结

  软硬链接的区别:a.软链接是一个独立的文件,有自己的inode,硬链接没有独立的inode。换言之建立软链接和曾经创建普通文件没有任何差别。b.软链接相当于快捷方式,硬链接呢?硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录。有点像给文件取了个别命。

图一:软链接
图二:硬链接

4. 软硬链接的作用

4.1 软链接的作用

  软链接就相当于创建快捷方式,我们可以将这个快捷方式放到任意位置,可以便捷的访问源文件。那么硬链接的作用呢?

4.2 硬链接的作用

  我们上面建立的硬链接是建立的文件,那么目录有没有软硬链接呢?目录的软链接和文件的软链接一模一样,这里不加以赘述,我们接下来重点研究目录的硬链接。
  当我们创建了目录后,我们发现目录的硬链接数都是2,这点是和文件不一样的,我们创建文件时,硬链接数默认都是1的,这是为什么呢?普通文件的初始硬链接数为1,是因为在任何情况下,只有一组文件名和当前文件的inode关系。那目录的硬链接为什么是2呢?比如1目录,这个目录本身和inode有一个映射关系,当我们进入Test目录后,cd .也是一直处于当前目录,而且我们发现,Test目录的inode和进入Test目录后.的inode是一样的。相当于这里的.就是1目录的别命。所以我们运行程序的时候用./+可执行程序运行,这里的.就相当于上级目录。所以一个目录除了目录本身,在目录下还有一个.也代表该目录,所以目录的硬链接数为2。

  当我们进入1,然后再新建一个1son的目录,发现1son目录的硬链接数是2,这是可以理解的,因为在1son目录下有一个.也代表1son目录,但是回到1目录那一层,发现1目录的硬链接数变为3。原因是1son目录中不仅有一个.,还有一个..,这个..代表上级目录,这个上级目录..就代表1,这个..的inode和1的inode是一致的。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/465c4fe02da04ff6ac276c73a13288e0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YGaMeS4quW_q-S5kOeahOeoi-W6j-WRmA==,size_10,color_FFFFFF,t_70,g_se,x_16#pic_center)

  这就在目录中建立了若干硬链接的连接,所以硬链接的作用就是方便目录之间通过相对路径方式进行跳转。

  以上就是关于Linux中软硬链接的问题,各位有不明白的地方请及时私信小编,小编定会知无不言言无不尽。我们一起进步,加油!!!

以上是关于深入理解软硬链接的主要内容,如果未能解决你的问题,请参考以下文章

Linux深入理解重定向inode详解与软硬链接的概念及区别

Linux深入理解重定向inode详解与软硬链接的概念及区别

链接:深入理解javascript构造函数和原型对象

《深入理解计算机系统》读书笔记:第七章 链接

《深入理解SPARK:核心思想与源码分析》——SparkContext的初始化(中)

HTML链接深入理解