共享文件
Unix内核通过三层数据结构管理打开的文件,使得文件共享和进程间通信成为可能。
三层数据结构:
- 描述符表(Descriptor Table):每个进程独有。表的每一项指向打开文件表中的一个条目。
- 打开文件表(Open File Table):系统全局共享。每个条目包含:
- 文件位置:当前读写偏移量。
- 引用计数:指向该条目的描述符数量(父子进程共享时>1)。
- v-node指针:指向v-node表中该文件对应的条目。
- v-node表(v-node Table):系统全局共享。每个条目包含:
- 文件元数据(
stat信息)。 - inode指针:指向磁盘上的inode。
- 文件元数据(
共享场景分析:
- 父子进程文件共享:
fork后父子进程共享同一打开文件表条目,因此共享文件位置。若父进程写入后子进程读取,子进程从父进程写入位置之后继续。 - 独立
open同一文件:两次独立open同一个文件会创建两个不同的打开文件表条目,各有独立的文件位置,但指向相同的v-node条目。 dup复制描述符:复制的描述符指向同一打开文件表条目,共享文件位置。
链接到
- 上一个知识点:10.9 目录与文件层次
- 下一个知识点:10.11 原子性与竞争