Linux下数据的存储
文件系统:
超级块 / inode bitmap / data bitmap / inode / data
文件的存储流程
通过超级块获取到各区域的地址,然后通过节点位图(inode bitmap )和数据位图( data bitmap)在二者的区域中快速找到空闲的 inode 节点和空闲的数据块将文件数据存储到空闲的数据块中;在将文件的元信息存储到 inode 节点中。
文件的获取流程
通过文件名到父目录中找到文件所对应的目录项,得到文件的 inode 节点号;通过超级块找到 inode 节点区域,再根据 inode 节点号找到对应的数据存储块位置,进而获取文件数据。
Linux下文件的数据和文件名是分离的
文件的数据存储完毕后,还需要再这个文件的所在目录下记录这个文件的名称以及 inode 节点号。
软/硬链接
链接文件
链接是指一种在共享文件和访问它的用户的若干目录项之间建立联系的方法。当用户查看文件属性时,会看到有类似 lrwxrwxrwx 的文件,第一个字母是 l ,这类文件被称为链接文件。在 Linux 中,被链接的文件可以存放在相同或者不同的目录上。文件的链接就是为了一个文件起一个或者多个名字,有硬链接和软连接两种形式。
硬链接
默认在不带任何选项参数的情况下,用 ln 来创建硬链接。建立硬链接就是在另外的目录或者本目录中增加目标文件的一个目录项。
ln 源文件 目标文件 //硬链接是直接通过 inode 节点号去访问被链接文件
图中标红的 2 是链接数
链接数:即表示一个 inode 节点所对应的所有目录项,是几就对应几个。删除一个文件,文件并不会立即删除,而是先删除了目录信息,并减去一个链接数,只有当链接数为 0 时 才会真正的删除该文件
软链接
软链接类似于 Windows 的快捷方式。它实际上是一种特殊的文件。在软链接文件中,保存了被链接文件的路径。被链接文件是实际上保存数据的文件。所有的 读/写 文件的指令,当涉及到链接文件时都会沿着软链接所保存的被链接文件的路径去找到实际的被链接文件。
ln -s 源文件 目标文件 //通过所保存的被链接文件的路径去访问被链接文件
二则各自的特点
1> 硬 : 本质上和源文件相同,都是一个文件的名称。与源文件公用一个 inode 节点,通过自己的 inode 节点访问源文件数据。
2> 软 : 本质上是一个独立的文件,有自己的 inode 节点。文件数据中保存着 源文件的路径,通过该路径访问源文件的数据。
二者的区别
1> 删除源文件后,软链接会失效,而硬链接只是减少了一个链接数,仍旧可以继续访问源文件数据。
2> 软链接可以跨分区、硬链接则不行。
3> 软链接可以对目录创建,硬链接则不可以。
删除源文件后仍可通过硬链接去访问源文件,只是链接数由 2 -> 1
删除源文件后软链接立即失效
动/静态库的打包
1.库的打包
动态库:
gcc -c -fPIC child.c(要打包的文件) -o child.o //先将 .c 文件打包编程成 .o 文件
gcc -shared child.o(要打包的文件)-o libmychild.so //再把 .o 文件打包成动态库
//动态库的命名方式 : lib×××.so
静态库:
gcc -c child.c -o child.o //解释同上
ar -cr libmychild.a child.o
//静态库的命名方式: lib×××.a
2.库的链接
动态库
有三种方式:
1. 把打包好的库文件放入指定的系统库目录下: 64位放入 /usr/lib64 32位放入 /usr/lib
2. export LIBRARY_PATH=$LIBRARY_PATH:. //这里记得连着写,不要带空格
//将当前库文件所在的路径添加入环境变量中, . 指的是当前路径
3. gcc main.c -o main -L./ -lmychild
//-L 指定链接库的路径(./ 当前路径) -l 指定链接的库名(libmychild)
静态库
mkdir _lib //首先创建一个文件夹
mv libmychild.a _lib //将生成的静态库移入 _lib
gcc main.c -o main -L./_lib -lmychild
//用 -L 指定静态库的所在路径(./_lib 当前目录下的 _lib) -l 指定链接的库名(libmychild)
3.库的加载
动态库
有两种方式:
1. 把打包好的库文件放入指定的系统库目录下: 64位放入 /usr/lib64 32位放入 /usr/lib
2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
//将当前库文件所在的路径添加入环境变量中, . 指的是当前路径
静态库不需要加载
这是动态库的打包和使用过程:
1.创建2个函数,main 调用child的头文件
2.动态的库的打包和使用过程