基本概念
内核使用3个数据结构描述一个打开的文件:进程表、文件表、V节点表
首先了解3种数据结构的概念
1 进程表
每一个进程有一个进程表。进程表里是一组打开的文件描述符,如标准输入0,标准输出1,标准错误2...
2 文件表
进程打开一个文件时,内核就为该文件创建一个文件表。
进程表对文件表一般是 一对多的关系 文件表对文件描述符也是一对多的关系(可能多个文件描述符指向同一文件表)
(这里解释下为什么进程表和文件表一对多的关系只是一般情况下,有什么特殊情况呢? 当父进程fork一个子进程时,复制了它的进程表,导致多个进程表对一个文件表)
文件表中包含了文件状态标志、当前偏移量、和V-node
pointer表项
文件状态标志如:read, write, append, sync, nonblocking等等
偏移量好理解,就不多解释了(它在write时会变化)
V-node
pointer就是指向V-node表的指针
3 V节点表(Linux只有i节点表)
每一个没打开的文件有一个V节点表。V-node table实际上跟进程关系不大,主要跟被打开的文件相关。一个打开的文件只有一个v-node表,所有打开它的进程共用此表
文件表对V节点表示多对一的关系。
V-node表主要是描述了文件信息、数据的访问入口
一个进程打开多个文件
如《APUE E3rd》的Figure3.7所示,一个进程打开多个文件。
文件描述符0和1各通过一个文件表打开一个文件
注:可能文件描述符0和3指向同一个文件表
多个进程打开一个文件
如《APUE E3rd》中figure 3.8所示,两个进程打开同一个文件。
两个进程使用的文件表都是进程独有的。也就是说一个文件表虽然是内核维护的,但它至属于某一个特定进程。