用于存储Linux中打开的文件数的数据结构
我试图理解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”,内核是否创
任务_结构
都指向文件_结构
,其中包含所有打开的文件描述符的列表。每个这样的条目都是指向结构文件的指针。此结构具有对任何特定文件进行操作所需的所有信息
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)
,它将得到两个文件描述符,每个描述符都引用structfile
的一个单独实例(每个描述符的f_count
设置为1)。但是,如果它调用一次open
,然后使用返回的文件描述符调用dup
,它仍然会有两个文件描述符,但现在每个描述符都引用同一个结构file
,并且f_count
设置为2。文件
结构跟踪打开文件的单个实例。在您描述的场景中,每个流程都将获得自己的结构副本。结构的f_count
成员用于跟踪引用同一文件实例的多个文件描述符。而f_pos
用于跟踪每个实例的当前文件位置
f_count
可以通过dup(2)
以及fork(2)
增加dup
创建另一个唯一的文件描述符,该描述符引用完全相同的打开文件实例。同样,当您的进程调用fork
时,父进程和子进程都引用相同的文件实例。引用同一结构文件的多个文件描述符共享其跟踪的文件位置
示例:
如果您的进程对同一个文件调用了两次open(2)
,它将得到两个文件描述符,每个描述符都引用structfile
的一个单独实例(每个描述符的f_count
设置为1)。但是,如果它调用一次open
,然后使用返回的文件描述符调用dup
,它仍然会有两个文件描述符,但现在每个描述符都引用相同的单个结构file
,并且f_count
设置为2