软硬连接

创建软连接

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命令更新