1.重定向
1.1什么是重定向
- 把本应该写到显示器上的内容,写到了文件里,这就叫做文件的重定向
- 我们再举一个追加重定向的例子
1.2重定向的原理
2.缓冲区
2.1什么是缓冲区?
- 缓冲区是语言层面提供的,由file结构体进行维护
2.2两种现象对比
- 第一种
- 第二种
- 总结:
write
系统调用接口只往文件里写了一行,但是库函数却都写了两行- 这是由于缓冲区导致的,我们平时输出到显示器上面的内容是行缓冲,而输出到文件里是全缓冲
- 如果我们
close(1)
,将标准输出关闭,1号文件描述符就变成了我们新创建的文件,所以在输入内容的时候用的是全缓冲 - 我们在其中加入了
fork()
,系统调用接口write
已经将内容写到了log.txt
当中,说明没有缓冲机制 - 但是两个库函数,是先写入缓冲区,然后创建父子进程,再分别刷新各自独立的缓冲区,这就导致输出两遍
- 进而我们可以得出结论,缓冲区机制是由语言层面提供的,并不是操作系统
- 但是操作系统也有自带的缓冲区
file *stream
的作用就是将用户级别的缓冲区,往操作系统刷新(例如调用write
接口)
3.dup2接口
3.1dup2描述及使用
newfd
是oldfd
的一份拷贝
- dup2的使用,将
fd
的内容拷贝至1号文件描述符下
3.2dup2接口的原理
- dup2的描述:dup2(fd,1)
- 调用
dup2
后,1号文件描述符本来对应的是别的struct file
,这个时候切断这个链接,就像close(1)
一样,他就会去指向它要拷贝的那个文件描述符指向的struct file
4.理解文件系统(以ext2分析)
4.1什么是文件系统?
- 本质上其实是系统对文件的一种管理策略,然后代码化,功能化,就变成了文件系统
4.2 ext2文件系统中的磁盘文件
4.2.1磁盘结构分析
- 那么具体如何分区管理呢?我们接下来看
4.2.2 磁盘分区管理的具体方式
4.3创建一个文件系统内部发生什么?
- 将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作
4.4查找,删除文件发生了什么?
- 查找文件:找到文件所在的
分区
和块组
,通过inode
编号在inode table
中找到对应的属性,再寻找对应的block映射关系
,将数据块中的内容提取出来 - 删除操作:在位图中,将
inode
对应的编号由1
置0
- 场景举例:如果文件被误删了,我们还有机会找回来,因为
只是修改了位图
,真正的inode没有被删除
,如果我们的数据没有被覆盖,可以通过遍历inode table找到对应的属性信息
,就可以找到对应的数据块映射关系
,就可以恢复文件了
4.5Linux中目录也是文件(一切皆文件)
4.6 ext2文件系统
5.文件的软硬链接
-
文件链接分为硬链接和软链接两种
-
硬链接:没有独立的
inode
,只是增加了一个和inode
具有映射关系的文件名,并没有创建新的文件
-
软链接:则是创建了一个新的文件,具有独立的inode,这个文件保存着链接文件的路径
6.关于动静态库的理解
6.1 C语言中的库函数调用过程
- 我们在写C语言过程中,在预处理阶段对
stdio.h
进行了包含,并且头文件只有printf
的声明,那函数的实现应该存放在哪里? - 系统将这些函数的实现放到了名为
lib.so.6
这个库文件当中,如果没有特别指定的情况,gcc
会到系统默认的搜索路径/usr/lib
下去查找,实质就是链接到lib.so.6
里的库函数,进而实现了函数
6.2动,静态库有什么区别?
-
静态库:在
编译链接时
,把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库 -
静态链接库
-
优点:库缺失不影响程序,运行速度快
-
缺点:由于静态库链接是将库的内容拷贝到程序,引起空间资源浪费
-
————————————————————————————
-
动态库:在
运行时才去链接动态库的代码
,整个系统里可以多个程序去共享使用库的代码 -
动态链接库
-
优点:程序体积小,节省空间
-
缺点:库缺失,程序就无法运行,可移植性差
-
————————————————————————————
-
总结:
-
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
-
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
-
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间
6.3函数库的生成
6.3.1库函数的参数
- 头文件:可以使用的方法或参数
- 库文件:具体的实现(二进制),为动静态链接提供条件
6.3.2静态库的生成及使用
6.3.3动态库的生成及使用
6.3.4如何让程序找到依赖的动态库?