在 Linux 中存储打开文件数的数据结构

Data structure to store number of open files in Linux

我正在尝试了解 Linux 数据结构及其管理打开文件的方式。根据我的理解,每个 task_struct 指向 files_struct,其中包含所有打开的文件描述符的列表。每个这样的条目都是指向 struct file 的指针。此结构包含对任何特定文件进行操作所需的所有信息。

struct filef_count成员是否表示同一文件的打开实例数?如果是这样,内核是否为每个打开的文件实例创建一个 file struct

示例:/users/soverflow/test.txt 如果进程 P1、P1 和 P3 打开相同的文件“/users/soverflow/test.txt”,内核是创建对应于 P1、P2 和 P3 的 "three"file struct 还是只创建一个 [=16] =] 并且所有进程都指向相同的结构 ?

如果所有进程都指向相同的结构,它们如何知道当前文件位置?

file 结构跟踪已打开文件的单个实例。在您描述的场景中,每个进程都会获得自己的结构副本。结构的 f_count 成员用于跟踪引用同一文件实例的多个文件 描述符 f_pos 用于跟踪每个实例的当前文件位置。

f_count 可以增加 dup(2) 以及 fork(2)dup 创建另一个唯一的文件描述符,它引用完全相同的打开文件实例。同样,当您的进程调用 fork 时,父进程和子进程都引用相同的文件实例。引用同一结构的多个文件描述符 file 共享它跟踪的文件位置。

示例:
如果您的进程对同一个文件调用 open(2) 两次,它将获得两个文件描述符,每个文件描述符都引用一个单独的结构实例 file(每个实例都将 f_count 设置为 1)。但是如果它调用 open 一次,然后用返回的文件描述符调用 dup,它仍然会有两个文件描述符,但每个现在都引用同一个结构 filef_count 设置为 2.