共享文件

Unix内核通过三层数据结构管理打开的文件,使得文件共享和进程间通信成为可能。

三层数据结构

  1. 描述符表(Descriptor Table):每个进程独有。表的每一项指向打开文件表中的一个条目。
  2. 打开文件表(Open File Table):系统全局共享。每个条目包含:
    • 文件位置:当前读写偏移量。
    • 引用计数:指向该条目的描述符数量(父子进程共享时>1)。
    • v-node指针:指向v-node表中该文件对应的条目。
  3. v-node表(v-node Table):系统全局共享。每个条目包含:
    • 文件元数据stat 信息)。
    • inode指针:指向磁盘上的inode。

共享场景分析

  • 父子进程文件共享fork 后父子进程共享同一打开文件表条目,因此共享文件位置。若父进程写入后子进程读取,子进程从父进程写入位置之后继续。
  • 独立 open 同一文件:两次独立 open 同一个文件会创建两个不同的打开文件表条目,各有独立的文件位置,但指向相同的v-node条目。
  • dup 复制描述符:复制的描述符指向同一打开文件表条目,共享文件位置。

链接到