[Linux] 文件描述符和打开文件之间的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/sai_j/article/details/82825595