符号链接和硬链接,静态库和动态库

这里只是要求简单理解
操作系统是如何管理文件的,我们用stat命令查看一个文件的相关信息

解释上面文件信息中的三个时间(acm):
Access:最后访问时间
Change:属性最后改变时间(inode)
Modify:文件内容最后修改时间

inode  存放文件元信息
文件是如何在磁盘上存放的呢,
i节点表中存放文件的inode,其实我们创建一个文件就会为这个文件分配一个inode标号
我们访问一个文件其实就是找到这个文件的inode编号,

创建一个文件的基本步骤:
1.存储属性
内核先找到一个空闲的i节点,把文件记录到其中

2.存储数据
该文件需要三个数据块来存放数据,就在数据块中找到三个空闲的空闲块,内核将数据依次复制到这几个空闲块中

3.记录分配情况
在磁盘上记录上面三个数据块列表
4.添加文件名到目录
内核将入口(inode 编号,文件名)添加到目录文件,文件名和inode之间的对应关系将文件名和文件内容及属性连接起来。

硬链接
我们知道找文件其实就是找到文件的inode ,那么如果两个文件的inode相同,所对应的文件也是相同的,
硬链接就是这样实现的,创建一个文件的硬链接其实就是将硬链接数加1,在删除的时候,只是将硬链接数减1,只有当硬链接数为0的时候,才会将这个inode 删除。

硬链接是通过inode 引用另外一个文件

软链接(符号链接)

软连接是通过文件名引用另外一个文件
软链接其实是将这个文件的全路径保存下来,如果将原文件删除,软连接文件就不能访问了


目录创建下来,它的硬链接数默认为2,而且目录不允许创建硬链接,但可以创建软连接,我们用vim 打开一个目录,发现里面的内容是该目录里面的文件名,其实目录也是一个文件,目录文件在磁盘上的数据区中保存的是它里面的文件名和文件的inode的映射关系。
Windos 下的快捷方式即为Linux下的软连接。

二、静态库和动态库

静态库:程序在编译时把库中的代码链接到可执行文件中,程序运行时不再需要静态库(后缀为.a)

动态库:在程序运行的过程中才去链接动态库到可执行文件中,多个程序共享使用库的代码 (后缀为.so)
假设现在有两个进程都依赖于某个动态库,当程序2要将动态库加载到内存时,会先检查内存中有没有这个动态库,如果已经存在,就将自己页表与该块内存建立映射关系。

使用ldd命令查看可执行程序所依赖的动态库


这里有一个libc.so 就是我们C标准库,操作系统的多数程序都是依赖C库,但我们为将libc.so进行删除后,会发现,很多命令都不能正常执行了,但是内建指令还是可以的,因为内建指令是父进程调用在系统函数执行了,并没有进行创建子进程进行程序替换,没有依赖于C库。

现在来自己实现一个静态库:


这里用到的生成静态库的的指令
ar -rc lib***.a test1.o  test2.o//静态库的名称为以lib开始,以.a结束

使用静态库的方法除了上面的使用静态库的完整名字方法外。还有一种

 
 
gcc -o test test.c libadd.a//使用完整名字 gcc -o test test.c -L. -ladd使用路径
//-L后面接路径, -l后面接库到名字(去掉lib和.a)

如何生成动态库.
因为链接动态库是在进程运行期间才加载的。所以这里有一个环境变量指定了到哪个目录下去找动态库

LD_LIBRARY_PATH
所以我们先将这个路径该为当前路径

我们看到这里的 
 gcc add.c -o libadd.so -fPIC -shared   //这里有两个选项是用来创建动态库的

猜你喜欢

转载自blog.csdn.net/misszhoudandan/article/details/80312022