进一步了解系统I/O

1.再次理解open接口

1.1opne的第三个参数

在这里插入图片描述

1.2第二个参数为什么为整形

在这里插入图片描述

2.write系统调用接口

2.1write接口

wtite的第一个参数是fp。我们的进程调用write接口,通过PCB之中保存的信息,,找到对应的结构体struct file_struct。再找到结构体之中的结构体指针数组 struct file*fd_array[],然后通过给定的参数fp即我们的数组的下标,取出保存的描述文件的结构体 struct file的指针,找到对应的文件结构体,得到文件的信息,与存储位置,即找到了我们的文件
在这里插入图片描述

2.2系统调用接口和库函数接口区别

系统调用接口是系统直接提供给外部使用的,库函数则是在此之上的进一步封装
在这里插入图片描述

3.缓冲区

3.1缓冲区是由语言提供的

我们的缓冲区是由语言提供的,由FILE 结构体进行维护
在这里插入图片描述

3.2为什么需要缓冲机制

提高计算器处理的效率,比如我们的程序会将数据全部存储在缓存区之中,在合适的时候再调用write刷新至系统之中
如果每产生一次数据就往系统刷新一次,这样会导致交互数据的次数大幅度的增长,效率也会急剧的下降

4.dup2、文件重定向

4.1dup2

int dup2(int oldfd, int newfd);
newfid是oldfd的一份拷贝

在这里插入图片描述

4.2文件重定向

结合上面描述可知,我们的输出函数之中,stdout的描述结构体之内,必然包含1号文件描述符;
而我们的dup2可以将文件描述符对应的内容进行赋值拷贝,因此文件重定向的实现原理就是,利用dup2狸猫换太子。

将1号文件描述符之中的内容替换成新的指向文件结构体的指针,但是我们的输出函数之中,保存的信息永远是1号文件描述符
调用输出函数还是会向1号文件描述符指向的文件之中输出信息,这样就完成了重定向。

追加重定向则是在打开文件的时候添加O_APPEND参数

打开的文件要进行关闭,实际我们的文件描述符是有限的(初始默认32个),无限制的打开而不关闭会造成文件描述符资源泄漏

5.理解文件系统

5.1文件系统是什么

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构

我们的硬盘上面存储着许多文件,同样需要将其管理起来,对应的就需要有管理者进行管理,这个管理者就是文件系统,文件系统对磁盘进行分区统筹,管理。

再形象一点,文件系统管理着很多文件,这些文件就是数据,而这些数据存储在硬盘上。
所以文件系统就是管理磁盘的软件系统,它降低了磁盘空间的使用难度,将磁盘数据更加形象化的展示给用户
在这里插入图片描述

5.2为什么需要文件系统

在这里插入图片描述

5.3文件系统如何对磁盘进行管理

5.3.1磁盘数据抽象化

在这里插入图片描述

5.3.1磁盘的分区管理

在这里插入图片描述

5.4我们的目录之中保存的是什么

在这里插入图片描述
文件都是都在目录之下,目录(directory)中保存着文件名和inode编号的映射关系,对文件的管理最后转移到了对目录进行管理,对文件的描述组织实际上就是对目录的描述和组织,对目录的描述方法是用struct file, struct file的f_path之中保存着文件和目录之间的关系,
即只需要管理好目录,通过目录之中的文件名和inode编号之间的关系,就可以快捷的找到我们所需要的文件,即对文件进行管理本质是对目录进行管理,通过目录和文件之间的映射关系,间接的管理我们的文件

1、根据文件名,通过Directory里的对应关系,找到文件对应的Inode number
2、再根据Inode number读取到文件的Inode table
3、再根据Inode table中的Pointer读取到相应的Blocks

在这里插入图片描述

5.5对文件操作的流程

在这里插入图片描述

5.6文件软硬链接

文件链接分为硬链接和软链接两种。
硬链接没有独立的inode,只是增加了一个和inode具有映射关系的文件名,并没有创建新的文件
软链接则创建了新的文件,具有独立的inode,这个文件保存着链接文件的路径
在这里插入图片描述
在这里插入图片描述

6.动静态库的打包方法

6.1什么是函数库

由上述可知,我们在预处理阶段只是将头文件“stdio.h”进行了包含,并且头文件中只有printf函数的声明,并没有实现,那么是在哪里实现函数的呢?

系统将这些函数的实现都放到了名为libc.so.6的库文件中去了,在没有特别指定的时候,gcc会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到libc.so.6库函数中去,这样就实现了函数,这也是链接的作用;

在这里插入图片描述

6.2动静态库的差别

静态链接:在编译链接的时候,将对应的代码拷贝至源文件
假如有n个程序都调用了库的同一个接口,则都需要拷贝一份,在一定程度上占用资源(硬盘资源和内存资源)

动态库:在运行的时候才去链接动态库的代码,整个系统里面可以只有一份,多个程序共享使用库的代码
在这里插入图片描述
在这里插入图片描述

6.3函数库生成

6.3.1常用命令

ldd:查看一个可执行文件依赖的库
ar -rc:静态库打包
ar -tv:查看库依赖的文件

6.3.2函数库需具备条件

在这里插入图片描述

6.3.3静态库生成

在这里插入图片描述
在这里插入图片描述

6.3.4动态库生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值