前言
文件描述符、文件句柄和i-node之间的关系,应该是Linux Native Programming的基本功。Golang、C++11写久了之后,这些概念有些淡忘,今天顺便梳理下。
铺垫
为了搞清楚这当中的关系,我们首先要了解内核维护的3个数据结构:
- 进程级的文件描述符表
- 系统级的打开文件句柄
- 文件系统级的i-node表
进程级的文件描述符表
单条表项,包括:
- 文件描述符标志,如close_on_exec标志;
- 对应文件句柄的索引
系统级的打开文件句柄
单条表项,包括:
- 当前文件偏移
- 文件打开标志、访问权限
- 对应inode对象的索引
文件系统级的i-node表
单条表项,包括:
- 文件类型和访问权限
- 文件的基本属性
分析
在前面,我们对基本概念进行了铺垫;接下来,我们结合下图进行更加细致的分析。
- 在进程A中,文件描述符1和文件描述符20指向同一个文件句柄23,这可能是dup()系统调用的结果;
- 进程A的文件描述符2和进程B的文件描述符2指向同一个文件句柄70,这可能是fork()后的结果&#