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

用于存储Linux中打开的文件数的数据结构,linux,linux-kernel,filesystems,kernel,linux-device-driver,Linux,Linux Kernel,Filesystems,Kernel,Linux Device Driver,我试图理解Linux数据结构以及它管理打开文件的方式。根据我的理解,每个任务_结构都指向文件_结构,其中包含所有打开的文件描述符的列表。每个这样的条目都是指向结构文件的指针。此结构具有对任何特定文件进行操作所需的所有信息 f_count结构文件的成员是否指示同一文件的打开实例数?如果是这样,内核是否为每个打开的文件实例创建一个文件结构 示例:/users/soverflow/test.txt 如果进程P1、P1和P3打开同一个文件“/users/soverflow/test.txt”,内核是否创

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

f_count
结构文件的成员是否指示同一文件的打开实例数?如果是这样,内核是否为每个打开的文件实例创建一个
文件结构

示例:/users/soverflow/test.txt 如果进程P1、P1和P3打开同一个文件“/users/soverflow/test.txt”,内核是否创建了与P1、P2和P3对应的“三个”
文件结构
,还是只创建了一个
文件结构
,并且所有进程都指向同一个结构


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

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

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

示例:

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

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

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

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