1.硬连接
什么是硬连接?,我们或许可以用操作清楚的认识什么是硬连接。
在我们学习文件的时候这个数字好像完全没有被提到过,这个代表什么意思呢?
这个代表该文件的inode编号与文件映射的次数,现在该文件的inode只与test.c这个文件名映射,所以该数字为1,这时候使用ln命令,给该文件建立一个硬连接文件。
ln test.c test.a//为test.c建立名为test.a的硬连接
看这两个文件的标号变为2,说明这两个文件使用的是一个inode编号,inode的编号一样说明他们本质上是一个文件。
所以硬连接的本质就是,给当前文件的inode编号再映射一个文件名。
那这个数字的作用也很显而易见了,这就是大名鼎鼎的引用计数,我用这个inode映射一个文件,引用计数++,删除一个该inode与文件名的映射引用计数--。
同样目录的这个数字也是引用计数,因为目录也是文件,但是新创建的一个目录,为什引用计数是2呢?
这是因为我们经常使用的 .和..本质就是硬连接,.就是当前目录的硬连接呀!!!!
2.软连接
同样使用ln命令为test.c创建一个名为test.soft的软连接
ln -s test.c test.soft
这个时候我们发现test.c的引用计数没有++,说明test.soft这个文件用的不是test.c的inode编号,test.soft是一个独立的文件。
软连接的本质:存储目标文件的路径,通过路径解析,找到文件的indoe。
3.动静态连接
例:用去网吧上网举例子
动态链接:我想要上网,我必须先到网吧,然后找网管开机。
我想用使用库的函数,得需要通过某种方式,去库中寻找这个函数。
库被删除,不能使用。
静态链接:直接把网吧的电脑搬到家里,想要上网直接在家里上网,但是这个电脑会占我家里的空间。
直接把库拷贝到我的程序中,这样直接就可以直接使用,但是这个程序会变大很多。
库被删除也可以使用。
gcc -static -o testhard test.c//生成静态连接的目标文件testhard
gcc - o testsoft test.c //生成动态连接的目标文件testsoft
让我们看看他们的大小分别是多少。
差了10倍有余,gcc默认的链接方式就是动态链接。