我试图了解Linux数据结构及其管理打开文件的方式。根据我的理解,每个task_struct
指向files_struct
,其中包含所有打开文件描述符的列表。每个这样的条目都是指向struct file
的指针。此结构具有操作任何特定文件所需的所有信息。
f_count
struct file
成员是否表示同一文件的打开实例数?如果是这样,内核是否为每个打开的文件实例创建一个file struct
?
示例:/users/soverflow/test.txt
如果进程P1,P1和P3打开相同的文件“/users/soverflow/test.txt”,内核是否会创建对应于P1,P2和P3的“三个”file struct
,或者只创建一个{{1}并且所有进程都指向相同的结构?
如果所有进程都指向相同的结构,他们如何知道当前文件的位置?
答案 0 :(得分:2)
file
结构跟踪打开文件的单个实例。在您描述的场景中,每个流程都将获得自己的结构副本。该结构的f_count
成员用于跟踪引用该文件的同一实例的多个文件描述符。 f_pos
用于跟踪每个实例的当前文件位置。
f_count
可以增加dup(2)
以及增加fork(2)
。 dup
创建另一个唯一的文件描述符,它引用完全相同的打开文件实例。同样,当您的进程调用fork
时,父进程和子进程都引用了相同的文件实例。引用相同结构file
的多个文件描述符共享它跟踪的文件位置。
例:
如果您的进程在同一文件上调用open(2)
两次,它将获得两个文件描述符,每个描述符引用一个单独的struct file
实例(每个f_count
设置为1)。但是如果它调用open
一次,然后使用返回的文件描述符调用dup
,它仍然会有两个文件描述符,但每个现在引用file
的同一个结构f_count
设置为2。