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

时间:2016-02-21 20:30:35

标签: linux linux-kernel filesystems kernel linux-device-driver

我试图了解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}并且所有进程都指向相同的结构?

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

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。