Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。ln -s命令产生软链接。
一、硬链接
在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬链接是文件的一个目录项,与源文件共用同一个inode节点,直接通过自己的inode节点访问源文件。
接下来我们实验一下:
[zkc@localhost testdir]$ touch file1.txt
[zkc@localhost testdir]$ ln file1.txt file2.txt
[zkc@localhost testdir]$ ll -i
结果如下图:
从上面的结果中可以看出,硬连接文件与原文件的inode节点相同。
如果我们将file1.txt删除:
从图中可以看出,file2.txt并没有被影响,所以,我们可以将硬链接产生的文件看做一份原文件的拷贝。
二、软链接
硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件。
我们实验一下:
[zkc@localhost testdir]$ touch file1.txt
[zkc@localhost testdir]$ ln -s file1.txt file2.txt
[zkc@localhost testdir]$ ll -i
结果如下图:
从上面的结果中可以看出,软链接文件与原文件的inode号不同。
接下来我们将原文件删除:
当删掉原文件后,软链接变为无效。
实际上,我们可以将软链接文件看做是我们平时在Windows上打开软件时所使用的快捷方式,当我们将原文件删除后,自然快捷方式也会失效。
三、静态库与动态库
静态库以(.a)为后缀:程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将再需要静态库。链接静态库,每个程序将自己在库中用到的指令代码单独写入自己可执行程序中,程序运行时无依赖,加载运行速度快,但是程序运行后有可能会有冗余代码在内存中
动态库以(.so)为后缀:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。将库中数据加载到内存中后,每个使用了动态库的程序都要根据加载的起始位置计算内部函数以及变量地址,因此动态链接动态库加载及运行速度相较静态链接是较为不如的,但是它也有好处,就是多个程序在内存中只需要加载一份动态库就可以共享使用。