一、软硬链接
硬链接
在了解硬链接前,我们先在linux下执行“ln 原文件名 形成的链接文件名”命令:
可以看到,当我们执行该命令后,我们就创建了一个hard_file.link文件,该文件是myfile文件的硬链接文件。现在大家可能看不出来有什么联系,我们此时再来执行“ls -li”命令,查看文件的inode编号:
可以看到,当我们查看这两个文件的inode编号时,这两个文件的inode编号时一样的。但是我们说过,一个文件拥有一个inode,一个inode唯一对应一个文件。但是在这里,我们却发现这两个文件的inode编号还是一样的。
我们再向myfile文件里面写入一些数据:
此时我们向myfile文件里面写入两个字符串,但是我们仔细观察这两个文件就可以发现,myfile文件和hard_file.link文件的大小是一样的。但是我们只向myfile文件里写入了数据,并没有向hard_file.link内写数据。这个现象就表明,这两个文件中的内容可能是一样的,是同步更新的。我们分别打开这两个文件:
我们打开这两个文件后就可以发现,这两个文件中的内容确实是一模一样的。
首先根据建立硬链接后文件并没有独立的inode我们可得知:建立硬链接,其实根本就没有建立新文件。没有建立新文件,那么它就没有属于自己的inode和数据块。但是该文件又确确实实存在,那么它的inode和数据块是哪里来的呢?答案是它用的其实就是与它建立硬链接的文件的inode和数据块。
因此,建立硬链接其实就是在指定路径下新增文件名和inode编号映射关系。建立硬链接所形成的文件与原文件共用inode和数据块。而
2.软链接
我们可以执行“ln -s 原文件名 形成的链接文件名”来建立软链接:
可以看到,在我们形成文件的权限前是以“l”表示的,这代表该文件是链接文件。
我们输入“ls -li”命令查看这两个文件的inode编号:
可以看到,此时的链接文件soft_file.link是拥有属于自己的inode编号的。这就说明该文件是一个独立的文件。再结合上面的硬链接形成的文件没有独立的inode编号可知,软硬链接的区别就在于“是否拥有独立的inode编号”
然后我们再将原文件删除:
可以看到,当我们把原文件删除后,这个链接文件就会一直闪红,此时我们再打开该链接文件:
此时出现了系统提示告诉我们该文件不存在。确实,soft_file.link的链接文件并不存在,但是链接文件本身是存在 。但系统却告诉我们要打开的文件的不存在。这就说明,当我们要打开软连接形成的文件时,实际打开的是其原文件。这同时也说明软链接形成的文件是可以自行找到原文件的,且该文件的数据块中保存的就是原文件的所在路径。
打开我们桌面上的快捷方式的属性,可以看到这里有一个目标位置和目标。目标中保存的就是该文件所处的路径。通过快捷方式,我们就可以再不更改该文件所属目录路径的情况下更加方便的将其打开。软链接文件同理,其数据块中存储了对应文件的所在路径,通过软链接的方式,就无需进入或运行时带上对应文件所在路径,能够更加便捷的打开对应的文件
3.软硬链接的使用
(1)软链接的使用
在上文中我们说过,软链接其实和快捷方式是类似的,可以快速定位文件。因此通过软链接可以用于让我们快速的定位一些库、头文件等数据。例如现在在“/home/tjj/mylink”路径下有一个mylink文件,该文件运行后会打印“hello link”。但是我们运行它时需要带上对应的路径,于是我们可以在其他路径下输入“ln -s 原文件名 形成的链接文件名”来形成软链接文件:
此时我们就成功创建一个link链接文件。然后我们再运行该程序。也是可以正常运行的。
(2)硬链接的使用
在了解硬链接的应用前,我们先要了解“引用计数”。
在截图中,每个文件的权限后面都跟了一个数字,我们的hard_file.link文件是mylink文件的链接文件,这两个文件的数字是2;而mylink.c文件没有进行硬链接,其数字就是1。
其实这里的这个数字就叫做“引用计数”,即文件硬链接链接个数。一个文件,每硬链接一个文件,它的引用计数就会+1,反之每删除一个硬链接文件,其引用计数就会-1。当引用计数归0时,就代表该文件彻底被删除了。因此在删除文件时除非是将硬链接文件全部删完,使引用计数归0,否则该文件都依然存在。
有了对于引用计数的概念后,就可以来了解硬链接的使用了。
在上图中,我们有一个普通文件mylink,它的引用计数是1。其引用计数为1很好理解,因为该文件自身就拥有文件名和inode的映射关系。
但是,在上图中我们也创建了一个目录,这个目录的引用计数却是2。原因也很好理解,我们先查看该目录的inode编号:
然后我们进入该目录,可以看到这里面什么都没有: