版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sai_j/article/details/82825595
前言
文件描述符、文件句柄和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()后的结果(进程A、B互为父子进程);
- 进程A的文件描述符0和进程B的文件描述符3虽然指向不同的打开文件句柄,但是各自的打开文件句柄均指向inode表中的同一项, 这可能是进程独自对同一文件发起了open()调用;
表象
- 两个不同的文件描述符,若指向同一打开文件句柄,将共享同一文件偏移量;如果其中一个文件描述符操作了文件偏移,则另一个文件描述符也将受影响;
- 两个不同的文件描述符,若指向同一打开文件句柄,将共享文件标志;如果其中一方通过fcntl修改了文件flag,则另一方也将受到影响;
- 文件描述符标志(close_on_exec)为进程中的文件描述符所私有。
参考文献
TLPI