当我们在LINUX当中查看时,会看到文件不只是有文件名还有一些其他的属性信息。
包括:
模式
硬链接数
文件所有者
组
大小
最后修改时间
文件名
那我们思考这些信息通过什么来查询的又存放在哪里呢。这里就要引入inode和block。
在硬件中存储一开始在磁盘中。
通过磁头来判定磁盘面,磁道,扇区。我们可以将它进行线性变换,想成数组。如下图
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
GDT,Group Descriptor Table:块组描述符,描述块组属性信息
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等数据区:存放文件内容
软链接:
软链接拥有自己的inode,并且文件中存放的是另一个文件的路径。是一个独立的文件。
硬链接:
硬链接和指向的文件拥有相同inode,不是独立的文件。linux中可以让多个文件用相同的inode。
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间
一般做打包给别人都会将静态库和头文件给对方,这样别人就可以复用你的代码,移植性强,但是比较费资源,可能很多静态库是重复的。
生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息
[root@localhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行。
从左到右搜索-L指定的目录。
由环境变量指定的目录 (LIBRARY_PATH)
由系统指定的目录
/usr/lib
/usr/local/lib
生成动态库:
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
在编译与静态库不同的是没有了 static,并且l后跟的是动态库的名字也就是去掉lib和.so
示例: gcc main.o -o main –L. -lhello
1拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2.更改 LD_LIBRARY_PATH
//就不是需要L后加自己的环境变量了
3.ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新
系统中其实有很多库,它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)
(现在大部分的云lib库中也有外部库比较方便,如果虚拟机中没有就需要想用之前的操作来进行操作)
-lm表示要链接libm.so或者libm.a库文件