深入理解计算机系统(第三版)/ CSAPP 杂谈,第10章:系统级I/O

  • 每个打开的文件,内核都保持着文件位置
  • Linux 每个进程都有当前工作目录
  • stat 和 fstat 可以读取文件的元数据(metadata)
  • readdir 以流形式读取目录内容
  • Linux 使用了 3 个数据结构表示打开的文件:
    1. descriptor table 描述符表。每个进程独立维护,通过打开的文件描述符索引
    2. file table 文件表。所有进程共享,持有 vnode 指针,文件位置,引用计数,引用计数为 0 时删除表项
    3. 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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据