软硬连接
创建软连接
ln -s hello.txt soft_file.link # -s 代表软连接
~/linux_test/testlinux ll -li #【li i代表的是inode inode是 存储问价标识区域】 ok at 08:16:41 总计 4.0K 133996 -rw-r--r-- 1 chen chen 39 10月22日 08:14 hello.txt 133999 lrwxrwxrwx 1 chen chen 9 10月22日 08:16 soft_file.link -> hello.txt # soft_file.link 代表
这里软连接soft_file.link 指向 hello.txt 他们文件inode 并不相同 但是效果相同
~/linux_test/testlinux cat hello.txt ok at 08:17:19 hello world
hello world
hello world
~/linux_test/testlinux cat soft_file.link ok at 08:20:48 hello world
hello world
hello world
创建硬链接
ln hello.txt hard_file.link
133996 -rw-r--r-- 2 chen chen 39 10月22日 08:14 hard_file.link 133996 -rw-r--r-- 2 chen chen 39 10月22日 08:14 hello.txt 133999 lrwxrwxrwx 1 chen chen 9 10月22日 08:16 soft_file.link -> hello.txt
发现 硬链接的inode 和 软链接的 inode 是相同的
有独立inode 的链接称为软连接 ,没有独立inode 的链接称为 硬链接
硬链接类似 源文件的引用 创建硬链接没有inode 所以 创建硬链接 没有创建新文件
创建硬链接的时候 会将源文件的引用计数++ 删除源文件并不影响创建出啊硬链接的文件 因为 有引用计数 ,硬链接会直接访问inode源地址 并不会影响硬链接 ,而软连接删除源文件则会发生找不到源文件的错误
软连接是将链接文件的路径进行存储 而硬链接是另存储了一份 inode
硬链接在linux中的应用
~/linux_test/testlinux mkdir testHardlink ok at 08:34:01
~/linux_test/testlinux ls ok at 08:34:14 hard_file.link hello.txt soft_file.link testHardlink
~/linux_test/testlinux ls -lai
ok at 08:34:15 总计 20 133995
drwxr-xr-x 3 chen chen 4096 10月22日 08:34 . 9287
drwxr-xr-x 4 chen chen 4096 10月22日 08:13 .. 133996
-rw-r--r-- 2 chen chen 39 10月22日 08:14 hard_file.link 133996
-rw-r--r-- 2 chen chen 39 10月22日 08:14 hello.txt 133999
lrwxrwxrwx 1 chen chen 9 10月22日 08:16 soft_file.link -> hello.txt 134000
drwxr-xr-x 2 chen chen 4096 10月22日 08:34 testHardlink
我新建出来的testHardlink文件夹的inode 是 13400 新文件的引用计数是2
为什么是2呢 ?
~/linux_test/testlinux cd testHardlink 1 err at 08:35:44
~/linux_test/testlinux/testHardlink ls -lai
2 err at 08:35:53 总计 8 134000
drwxr-xr-x 2 chen chen 4096 10月22日 08:34 . 133995
drwxr-xr-x 3 chen chen 4096 10月22日 08:34 ..
进入testHardlink文件夹后发现 ' . ' 目录的 inode 是134000
~/linux_test/testlinux/testHardlink mkdir testHardlink ok at 08:35:56
~/linux_test/testlinux/testHardlink cd .. ok at 08:37:36
~/linux_test/testlinux ls ok at 08:37:41 hard_file.link hello.txt soft_file.link testHardlink
~/linux_test/testlinux ls -la ok at 08:37:43 总计 20
drwxr-xr-x 3 chen chen 4096 10月22日 08:34 .
drwxr-xr-x 4 chen chen 4096 10月22日 08:13
.. -rw-r--r-- 2 chen chen 39 10月22日 08:14 hard_file.link
-rw-r--r-- 2 chen chen 39 10月22日 08:14 hello.txt
lrwxrwxrwx 1 chen chen 9 10月22日 08:16 soft_file.link -> hello.txt
drwxr-xr-x 3 chen chen 4096 10月22日 08:37 testHardlink ~/linux_test/testlinux
在testHardlink 中再创建文件夹 发现 testHardlink 的引用计数是 3
~/linux_test/testlinux cd testHardlink/testHardlink ok at 08:37:47
~/l/testl/testHardlink/testHardlink ls -lai ok at 08:38:54 总计 8 134002
drwxr-xr-x 2 chen chen 4096 10月22日 08:37 . 134000
drwxr-xr-x 3 chen chen 4096 10月22日 08:37 ..
发现 testHardlink/testHardlink 文件下 的 '..'目录的inode 是 13400
其中. / .. 都是 该文件夹的硬链接
linux 动静态库
静态库(.a)
程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候不需要静态库
动态库(.so)
动态库的链接有操作系统的参与
程序运行的时候去链接动态库的代码多个程序共享使用 库的代码
动态库的链接的可执行文件仅仅包含到函数地址的一个表,而不是外部函数所在文件的整个机器码
在可执行文件开始运行前,外部函数的机器码 由操作系统从磁盘上的动态库中复制到内存的共享区中。这个过程称为动态链接
在共享区,一份动态链接库可以多个程序间共享
生成静态库
~/l/testl/testlib ls ok at 09:52:44 add.c add.h main.c makefile sub.c sub.h
libmymath.a:add.o sub.o
ar -rc $@ $^
myadd.o:add.c
gcc -c add.c -o add.o
mysub.o:sub.c
gcc -c sub.c -o sub.o
.PHONY:clean
clean:
rm -rf *.o libmymath.a
main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main()
{
int a = 10;
int b = 20;
printf("add(a,b) = %d\nsub(a,b) = %d",add(a,b),sub(a,b));
return 0;
}
-L 指定库路径-l 指定库名
静态库删除libmymath.a 文件后 依然可以运行
~/l/testl/testlib make clean ok at 09:59:22 rm -rf *.o libmymath.a ~/l/testl/testlib ./test ok at 10:00:02 add(a,b) = 30 sub(a,b) = -10%
查看静态库中的目录列表
~/l/testl/testlib ar -tv libmymath.a ok at 10:06:25 rw-r--r-- 0/0 1224 Jan 1 08:00 1970 add.o rw-r--r-- 0/0 1224 Jan 1 08:00 1970 sub.o
库的搜索路径
从左到右搜索-L指定的目录。
由环境变量指定的目录 (LIBRARY_PATH)
由系统指定的目录
/user/lib | /user/local/lib
生成动态库
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
编译选项 l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径
gcc -fPIC -c sub.c add.c
运行动态库 动态库需要告诉操作系统库在哪里
拷贝.so文件到系统共享库路径下, 一般指/usr/lib或者配置软链接 机进行配置(常用)
更改LD_LIBRARY_PATH 环境变量
ldconfig 配置/etc/ld.so.conf.d/新建xxx.conf 为文件 里面写好路径
再使用ldconfig命令更新