【Linux系统编程】第三十弹---软硬链接与动静态库的深入探索

小林熬夜学编程 2024-10-21 08:33:01 阅读 56

✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】

目录

1、软硬链接

1.1、见一见

1.2、特征

1.3、什么是软硬链接?有什么用(为什么)?

 2、动态库和静态库

2.1、什么是动静态库


1、软硬链接

1.1、见一见

软链接

命令演示一

<code>[jkl@host link]$ touch file_target1.txt # 创建普通文件

[jkl@host link]$ ln -s file_target1.txt file_soft.link # 将link文件软链接到txt文件上

[jkl@host link]$ ll

total 0

lrwxrwxrwx 1 jkl jkl 16 Sep 5 15:30 file_soft.link -> file_target1.txt

-rw-rw-r-- 1 jkl jkl 0 Sep 5 15:30 file_target1.txt

[jkl@host link]$ ll -i

total 0

1704523 lrwxrwxrwx 1 jkl jkl 16 Sep 5 15:30 file_soft.link -> file_target1.txt

1704522 -rw-rw-r-- 1 jkl jkl 0 Sep 5 15:30 file_target1.txt

运行结果 

ln -s:ln ---> link(链接);-s ---> soft(软)   后者链接前者。两个文件都是独立的文件,因为都有各自的inode编号。

 命令演示二

<code>[jkl@host link]$ ll

total 0

lrwxrwxrwx 1 jkl jkl 16 Sep 5 15:30 file_soft.link -> file_target1.txt

-rw-rw-r-- 1 jkl jkl 0 Sep 5 15:30 file_target1.txt

[jkl@host link]$ rm file_soft.link

[jkl@host link]$ ll

total 0

-rw-rw-r-- 1 jkl jkl 0 Sep 5 15:30 file_target1.txt

[jkl@host link]$ ln -s file_target1.txt file_soft.link

[jkl@host link]$ ll

total 0

lrwxrwxrwx 1 jkl jkl 16 Sep 5 15:40 file_soft.link -> file_target1.txt

-rw-rw-r-- 1 jkl jkl 0 Sep 5 15:30 file_target1.txt

[jkl@host link]$ rm file_target1.txt

[jkl@host link]$ ll

total 0

lrwxrwxrwx 1 jkl jkl 16 Sep 5 15:40 file_soft.link -> file_target1.txt

运行结果

删除软连接的文件对目标文件没影响,但是目标文件删除之后,软连接的文件就没用了。删除目标文件,可以 rm 或者 unlink 后面跟要删除的连接文件名,这两个命令可以删除目标文件。

硬链接

命令演示

<code>[jkl@host link]$ touch file_target2.txt # 创建普通文件

[jkl@host link]$ ln file_target2.txt file_hard.link # 硬链接文件

[jkl@host link]$ ll

total 0

-rw-rw-r-- 2 jkl jkl 0 Sep 5 15:51 file_hard.link

lrwxrwxrwx 1 jkl jkl 16 Sep 5 15:40 file_soft.link -> file_target1.txt

-rw-rw-r-- 1 jkl jkl 0 Sep 5 15:48 file_target1.txt

-rw-rw-r-- 2 jkl jkl 0 Sep 5 15:51 file_target2.txt

[jkl@host link]$ ll -i

total 0

1704524 -rw-rw-r-- 2 jkl jkl 0 Sep 5 15:51 file_hard.link

1704523 lrwxrwxrwx 1 jkl jkl 16 Sep 5 15:40 file_soft.link -> file_target1.txt

1704522 -rw-rw-r-- 1 jkl jkl 0 Sep 5 15:48 file_target1.txt

1704524 -rw-rw-r-- 2 jkl jkl 0 Sep 5 15:51 file_target2.txt

运行结果 

不是独立的文件,因为没有独立的inode编号 

1.2、特征

1. 软链接是一个独立的文件,因为有独立的inode编号 -> 软连接的内容:目标文件所对应的路径字符串 -> 类似于windows中的快捷方式硬链接不是一个独立的文件,因为没有独立的inode编号,用的是目标文件的inode。硬链接是什么?-> 硬链接就是一个文件名和inode的映射关系,建立硬链接,就是在指定的目录下,添加一个新的文件名和inode编号的映射关系!属性中有一列硬链接数 <=> 文件的磁盘引用计数:有多少个文件名字符串通过inode编号指向inode。

定位一个文件的两种方式:

1、通过路径,最终还是要通过inode number查找    -> 软链接。2、直接找目标文件的inode number  -> 硬链接。

1.3、什么是软硬链接?有什么用(为什么)?

硬链接

硬链接通过索引节点(inode)来进行连接的。在Linux的文件系统中,每个文件都有一个唯一的索引节点号,而硬链接就是多个文件名指向同一个索引节点。这意味着,尽管文件名不同,但它们都指向磁盘上的同一块数据。

软链接(快捷方式)

软链接,也称为符号链接,是一个特殊类型的文件,它包含了对另一个文件或目录的引用。这个引用可以是一个路径,通过这个路径可以访问到目标文件或目录。软链接类似于Windows中的快捷方式,但它是一个独立的文件,不包含目标文件的数据,只包含对目标文件的引用。

为什么要有软链接?

1. 软链接可以将一个文件或目录的访问路径重定向到另一个位置。这可以方便地将文件或目录放置在不同的位置,同时仍然可以通过统一的路径进行访问。2. 软链接可以用来简化文件或目录的路径

讲解为什么要有硬链接之前先看一段命令

命令演示

<code>[jkl@host link]$ ll -ai

total 12

1704521 drwxrwxr-x 3 jkl jkl 4096 Sep 5 16:47 .

1444333 drwxrwxr-x 19 jkl jkl 4096 Sep 5 15:28 ..

1704525 drwxrwxr-x 3 jkl jkl 4096 Sep 5 16:52 dir

[jkl@host link]$ ll dir -ai

total 12

1704525 drwxrwxr-x 3 jkl jkl 4096 Sep 5 16:52 .

1704521 drwxrwxr-x 3 jkl jkl 4096 Sep 5 16:47 ..

1704526 drwxrwxr-x 2 jkl jkl 4096 Sep 5 16:52 otherdir

[jkl@host link]$ ll dir/otherdir -ai

total 8

1704526 drwxrwxr-x 2 jkl jkl 4096 Sep 5 16:52 .

1704525 drwxrwxr-x 3 jkl jkl 4096 Sep 5 16:52 ..

运行结果 

为什么要有硬链接? 

构建Linux的路径结构,让我们可以使用一个点和两个点来进行路径定位;一般用硬链接来做文件备份。

 注意:

Linux系统中,不允许给目录建立硬链接 -> 避免形成路径环绕。

为什么又给. ..这样的目录设置硬链接呢???

可以理解为特殊情况。文件名是固定的,所有的系统指令在设定的时候都知道. ..是在干什么。

任何一个目录,刚开始新建的时候,引用计数(硬链接数)一定是2。

命令演示

<code>[jkl@host link]$ mkdir dir1

[jkl@host link]$ mkdir dir2

[jkl@host link]$ mkdir dir3

[jkl@host link]$ ll -d dir1 dir2 dir3

drwxrwxr-x 2 jkl jkl 4096 Sep 5 17:58 dir1

drwxrwxr-x 2 jkl jkl 4096 Sep 5 17:59 dir2

drwxrwxr-x 2 jkl jkl 4096 Sep 5 17:59 dir3

运行结果 

在一个目录A中新建一个目录,引用计数会加+1,因为新建目录的..目录指向它,一个目录内部有几个目录:A引用计数 -2 

命令演示

<code>[jkl@host link]$ ll dir -di

1704525 drwxrwxr-x 3 jkl jkl 4096 Sep 5 16:52 dir

[jkl@host link]$ cd dir

[jkl@host dir]$ mkdir dir1

[jkl@host dir]$ ll dir1 -di

1704530 drwxrwxr-x 2 jkl jkl 4096 Sep 5 18:03 dir1

[jkl@host dir]$ cd ..

[jkl@host link]$ ll dir -di

1704525 drwxrwxr-x 4 jkl jkl 4096 Sep 5 18:03 dir

运行结果 

补充:

下面解释一下文件的三个时间(acm):

Access 最后访问时间Modify 文件内容最后修改时间Change 属性最后修改时间

 2、动态库和静态库

2.1、什么是动静态库

Linux系统

静态库(后缀.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)。动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

Windows系统

静态库(后缀为.lib)动态库(后缀为.dll)

我们有没有用过库呢???

用过,C/C++标准库 -> strerror strstr strlen / vector list stack ...

‌ldd命令‌是‌Linux中用于显示可执行文件或共享库所依赖的共享库的工具。它可以帮助开发者和管理员确保程序能够找到和链接到正确的共享库版本。 

C语言代码

<code>[jkl@host lib]$ vim test.c

[jkl@host lib]$ gcc test.c

[jkl@host lib]$ ./a.out

hello linux

[jkl@host lib]$ ldd ./a.out

linux-vdso.so.1 => (0x00007ffe3adfe000)

libc.so.6 => /lib64/libc.so.6 (0x00007f1f7adec000)

/lib64/ld-linux-x86-64.so.2 (0x00007f1f7b1ba000)

[jkl@host lib]$ ls -l /lib64/libc.so.6

lrwxrwxrwx 1 root root 12 Mar 23 2023 /lib64/libc.so.6 -> libc-2.17.so

运行结果 

 C++代码

<code>[jkl@host lib]$ vim test.cc

[jkl@host lib]$ g++ test.cc

[jkl@host lib]$ ./a.out

hahaha

[jkl@host lib]$ ldd a.out

linux-vdso.so.1 => (0x00007ffd18bf5000)

libstdc++.so.6 => /home/jkl/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6 (0x00007f2448cb6000)

libm.so.6 => /lib64/libm.so.6 (0x00007f24489b4000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f244879e000)

libc.so.6 => /lib64/libc.so.6 (0x00007f24483d0000)

/lib64/ld-linux-x86-64.so.2 (0x00007f2449037000)

[jkl@host lib]$ ll /home/jkl/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6

-rwxrwxr-x 1 jkl jkl 11404264 May 30 15:32 /home/jkl/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6

[jkl@host lib]$ ll /usr/lib64/libstdc++.so.6

lrwxrwxrwx 1 root root 19 Jan 8 2021 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19

运行结果 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。