前言
继续阅读《深入理解计算机系统》这本经典书籍
本节是第十章
系统级I/O
输入/输出(I/O)是主存和外部设备之间复制数据的过程
1、Unix I/O
一个Linux文件就是一个m个字节的序列
所有I/O设备都模型化为文件,I/O则被当做对应文件的读写来执行
- 打开文件:内核返回一个非负整数,称为描述符,在后续操作中标记这个文件
- linux shell创建的每个进程都有三个打开的文件:标准输入(0)、标准输出(1)、标准错误(2)
- 改变当前文件位置:应用通过seek操作,显式的设置文件的当前位置为k
- 读写文件:都是从当前文件位置k开始
- 关闭文件:释放文件打开时创建的数据结构,恢复描述符的可用
2、文件
文件类型
- 普通文件:文本文件和二进制文件
- 目录:包含一组链接
- 套接字:用来与另一个进程跨网络通信
调用open函数打开或创建文件
flags参数指明访问方式
- O_RDONLY:只读
- O_WRONLY:只写
- O_RDWR:读写
- O_CREAT:创建一个截断的文件
- O_TRUNC:文件已存在,截断它
- O_APPEND:写之前,设置文件位置到文件结尾
mode指定文件的访问权限
close函数关闭文件
read和write读写文件
3、用RIO包健壮的读写
RIO(robust I/O)包:自动处理不足值
无缓冲的输入输出函数
通过调用rio_readn和rio_writen函数
应用程序可以在内存和文件之间直接传送数据
带缓冲的输入函数
如读取一行
4、读取文件元数据
应用程序通过stat和fstat函数检索关于文件的信息(元数据)
stat数据结构
5、读取目录内容
用readdir函数读取目录内容
一个例子
6、共享文件
内核用三个相关的数据结构表示打开的文件
- 描述符表:每个进程由独立的描述符表,每个打开的描述符表项指向文件表中的一个选项
- 文件表:打开文件的集合,所有进程共享,每个表项包括当前文件位置、引用计数、指向v-node表对应表项的指针
- v-node表:所有进程共享,包含stat结构中的大多数信息
一个没有共享的例子
一个有共享的例子
子进程继承父进程
7、I/O重定向
用dup2函数进行I/O重定向
结语
各种I/O包如下