在内核中,与文件描述符相关的三个主要数据结构分别是:
-
文件描述符表(进程级):这是每个进程所拥有的数据结构,用于维护进程中打开的所有文件描述符。每个 fd 在这个表中都有一个对应的条目,指向更底层的文件表示结构。
-
打开文件列表(系统级):这是一个全系统范围内的数据结构,用于跟踪所有已打开的文件。当一个文件被打开时,不管它被打开了多少次,系统级的列表中都有一个对应的条目。这个列表包含了文件的当前状态,如文件指针的位置和访问模式。
-
i-node 表(系统级):这是文件系统级别的数据结构,包含了文件系统中所有文件的 inode。inode 是一个存储文件元数据的数据结构,例如文件的大小、权限、所有者以及文件数据所在的位置。每个文件或目录在文件系统中都有一个唯一的 inode。
这里我们借用《Linux/UNIX 系统编程手册》这本书中的这张图来介绍这三个数据结构的区别:
先开看进程 A,它的 1 号 fd 和 20 号 fd 指向了打开文件表(系统级)的同一项。
这种情况