当许多进程打开同一个特殊文件时会发生什么?

4
例如,我有两个进程A和B尝试打开一个特殊文件(/dev/example)。驱动程序有一个open 方法来初始化一个结构体(struct C)并将其传递给 filp->private_data。当后来的进程B打开相同的特殊文件时,如果我理解正确,会有两个struct file的实例(即指向同一struct file的两个filp指针)。open方法是否会再次初始化struct C并将其传递给filp->private_data,那么进程A初始化的struct C会发生什么?

你正在使用哪个函数来打开它? - Patrick Collins
使用 open() 函数,不同的函数会有不同的结果吗? - mark4rd
我不这么认为,似乎open是一个系统调用的包装器,我主要想知道要查找哪些文档。 - Patrick Collins
1
我想这取决于驱动程序的实际实现方式。在某些情况下,初始化单个结构并将其返回给每个调用 open() 的调用方可能是有意义的。而在其他情况下,为每个用户生成唯一的结构可能更合适。在没有更多有关驱动程序(可能包括代码)的信息的情况下,无法确定哪种适合本例。 - twalberg
谢谢回复。据我所知,没有人将任何结构返回给任何调用者。每个文件都有一个特定的结构文件来表示它,并且它被传递给在文件上操作的任何函数。这个问题是一般性的,不涉及任何特定的驱动程序。 - mark4rd
如果在fopen()中使用O_APPEND,我相信两个进程可以同时写入文件... - shkschneider
1个回答

1
当进程B打开同一个特殊文件时会发生什么? 如果我理解正确的话,我们将有两个struct file实例(指向同一个struct file的两个filp指针)。
这是错误的。每个open(2)都与一个struct file匹配。引用自LDD3/Chapter3:
文件结构表示已打开的文件。(它不特定于设备驱动程序;系统中的每个打开文件在内核空间中都有一个关联的struct file。)它由内核在打开时创建,并传递给任何操作该文件的函数,直到最后关闭。在关闭文件的所有实例之后,内核将释放数据结构。

要使两个进程共享相同的struct file,它们必须通过相同的open(2)系统调用获取各自的文件描述符。这意味着它们可以是父子关系(父进程发出open(2),然后通过fork(2)将子进程继承自父进程的返回文件描述符),或者它们可以是访问相同文件描述符的pthread。

在您的情况下,假设进程AB没有父子关系,则它们分别发出单独的open(2)系统调用。因此,它们分别与不同的struct file相关联。结果,每个进程都应该分配、初始化并存储一个不同的struct C(在其filp->private_data中)。

它们总是共享的(可能会让您感到困惑)是指向特殊文件的struct inode


编辑: 如@twalberg在评论中所述,这确实高度依赖于驱动程序。一般来说,filp->private_data是Linux内核驱动程序API的一部分,以允许每个open(2)单独的状态。但是,根据驱动程序的不同,有时将多个不同的struct file关联到相同的存储状态中可能是明智的选择。


1
要使两个进程共享相同的struct file,它们必须具有父子关系,或者可以使用通过UNIX域套接字传递文件描述符的方法。详见:https://dev59.com/QnNA5IYBdhLWcg3wku3O - user149341

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接