目录
1.重定向
重定向分为两种:
- 清空重定向
>:重定向到文件中,先清空文件中内容 - 追加重定向
>>:向文件中追加内容
比如说在bash中将一串字符重定向到文件中。
1.1重定向原理:
重定向实际上是更改了标准输出文件描述符的指向,让其标准输出指向另外一个文件描述符。
原理如图:凡是往标准输出中写的内容,都写到了newfile中
1.2重定向接口
#include <unistd.h>
int dup2(int oldfd, int newfd)
操作步骤:
- 关闭newfd,关闭成功走2,关闭失败则重定向失败
- newfd拷贝oldfd
例:标准输出被重定向了dup_test文件中。
2.动态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
两个命令:
ldd [可执行程序],查看当前程序依赖的动态库文件
file [可执行文件],可查看文件的属性
2.1生成动态库
- 编译动态库的源码文件中不能出现main函数
-
gcc -shared -fPIC 文件名 -o libfuc.so:fuc称之为动态库的名字,前缀:lib,后缀:.so
2.2使用动态库
-
包含动态库的头文件
-
指定链接动态库所在的路径:
-L [路径] -
指定链接动态库的名字:
-L [库名称、去掉lib和so]
编译可执行程序的时候,一定要告诉编译器,我们链接的是哪个动态库。
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。
3.静态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。
windows下静态库后缀为.lib,动态库后缀为.dll。
3.1生成静态库
-
ar -rc libfuc.a 依赖的文件:fuc:静态库的名称,依赖的文件必须是.o文件
3.2使用静态库
-
gcc 文件名 -L 路径 -lfunc
若未使用-static时,则一定为动态链接。
4.文件系统
磁盘是一种顺序的存储介质,但是顺序存储方式会导致磁盘的利用率的问题,产生磁盘碎片。
所以采用离散式存储会提高程序对磁盘的利用率。
目前Linux中最常用的文件系统为:ext2。
4.1ext2文件系统
(图源:LinuxC编程一站式学习)
文件系统中存储的最小单位为块(Block),一个块有多大是在格式化时确定的。mke2fs -b可以设置块大小为1024、2048、4096字节。上图中启动块(Boot Block)的大小是确定的,就是1KB,启动块由PC标准决定,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。ext2文件系统将整个分区划分成若干个同样大小的块组(Block Group)。
- Super Block(超级块):描述整个分区的文件系统信息,例如块大小、文件系统版本号。超级块在每个块组的开头都有一份拷贝。
- GPT(块组描述符):由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,例如块组从哪里开始是inode表、哪里是数据块、空闲的inode表和数据块还有多少等。在开头也有一份拷贝,这些信息十分重要。
- Block Bitmap(块位图):本质上是一个位图,每一个比特位表示Data blocks当中块的使用情况,为1表示占用,为0表示空闲。
- inode Bitmap(inode 位图):每个比特位表示一个inode是否空闲可用。
- inode Table(inode 表):每个文件都有一个inode,一个块组的所有inode组成了inode表。inode表占多少个块在格式化时就要决定并写入块组描述符。mke2fs默认策略是一个块组有多少个8KB就分配多少个inode。
- 数据块:存放文件内容
4.2文件的存储
- 在Block Bitmap区域查找空闲的Data block块,将文件存储在空闲的Data block块当中。
- 通过inode Bitmap获取空闲的inode节点,通过inode节点去描述文件在Data Block区域当中存储位置。
- inode+文件名称被作为目录的目录项保存下来
4.3文件的获取
- 通过文件名称和inode节点号找到inode对应的文件信息
- 在Data Block区域获取当前文件存储的内容,再进行拼接,拼接完成之后就是文件内容了。
5.软连接
软连接:相当于文件的一个快捷方式(别名)
- 生成软连接文件:
ln -s [源文件] [软连接文件] - 不同inode节点
- 保存的信息是相同的
- 在删除软连接文件或软连接文件指向的源文件的时候,一定要将二者都删除掉。
6.硬连接
硬连接:通过inode引用另外一个文件。
- ln 源文件 生成的硬连接文件
- inode节点一模一样
- 两者除名称不一样,其余都一样
删除文件时干了两件事情:①将inode表中对应的记录删除掉,②硬连接数-1,如果为0,则将对应的磁盘空间释放。