深入理解计算机系统(第三版)/ CSAPP 杂谈,第10章:系统级I/O
- 每个打开的文件,内核都保持着文件位置
- Linux 每个进程都有当前工作目录
- stat 和 fstat 可以读取文件的元数据(metadata)
- readdir 以流形式读取目录内容
- Linux 使用了 3 个数据结构表示打开的文件:
- descriptor table 描述符表。每个进程独立维护,通过打开的文件描述符索引
- file table 文件表。所有进程共享,持有 vnode 指针,文件位置,引用计数,引用计数为 0 时删除表项
- v-node table v-node 表。所有进程共享,包含 stat 结构的大部分信息。
- I/O 重定向通过 dup2 函数实现。
- 标准 I/O 库将打开的文件模型化为一个流(steam),对于程序员而言,一个流就是一个指向 FILE 类型的结构的指针。每个 ANSI C 程序开始时都有三个打开的流:stdin,stdout,stderr(0,1,2)
- 类型为 FILE 的流是对文件描述符和流缓冲区的抽象。如第一次调用 getc 时,库会调用一次 read 函数填满缓冲区。
- 执行输出函数后,若想使用输入函数,需要使用 fflush 清空缓冲区,或使用 fseek,fsetpos,rewind 重置当前文件位置
- 执行输入函数后,若想使用输出函数,需要使用 fseek,fsetpos,rewind 重置当前文件位置,除非输入函数遇到了文件结束。
版权所有,转载请注明出处:
https://sickworm.com/?p=1639