- 输入/输出是在主存和外部设备之间复制数据的过程
Unix I/O
- Unix I/O:将设备被优雅地映射为文件,允许Linux内核引出一个简单、低级的引用接口,使得所有的输入和输出都能以一种统一且一致的方式来执行:
- 打开文件:内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件
- 打开标注输入、标准输出、标准错误文件
- 改变当前的文件位置:从文件开头起始的字节偏移量
- 读写文件
- 关闭文件
文件
- Linux文件类型:
- 普通文件:文本文件(只含有ASCII或Unicode字符的普通文件)和二进制文件
- 目录:包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件也可能是另一个目录
- 套接字:用来与另一个进程进行跨网络通信的文件
打开和关闭文件
open
函数将filename转换为一个文件描述符,并且返回描述符数字close
函数关闭一个打开的文件
读和写文件
- 调用
read
和write
函数来执行输入和输出
用RIO包健壮地读写
- RIO的无缓冲的输入输出函数:直接在内存和文件之间传送数据,没有应用级缓冲
- RIO的带缓冲的输入函数:高效地从文件中读取文本行和二进制数据,是线程安全的
读取文件元数据
- 通过调用
stat
和fstat
函数可以检索关于文件的信息(元数据),stat
的输入是文件名,fstat
的输入是文件描述符
读取目录内容
- 用
readdir
函数来读取目录的内容,输入为目录流,返回指向目录流中下一个目录项的指针,没有则返回NULL。目录项是一个结构,包含文件名和文件位置 opendir
函数以路径名为参数,返回指向目录流的指针,流是对条目有序列表的抽象,在这里是指目录项的列表closedir
函数关闭流并释放其所有的资源
共享文件
- 内核用三个相关的数据结构来表示打开的文件:
- 描述符表:每个进程都有它独立的描述符表,每个打开的描述符表项指向文件表中的一个表项
- 文件表:打开文件的集合是由一张文件表来表示的,所有进程共享这张表,每个文件表的表项组成包括当前的文件位置、引用计数,以及一个指向v-node表中对应表项的指针
- v-node表:同文件表一样,所有的进程共享这张v-node表,每个表项包含stat结构中的大多数信息
- 多个描述符可以通过不同的文件表表项来引用同一个文件
I/O重定向
dup2
函数复制描述符表表项oldfd
到描述符表表项newfd
,覆盖后者以前的内容
标准I/O
- C语言定义了一组高级输入输出函数,称为标准I/O库