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

时间:2014-08-25 13:24:43

标签: c linux linux-kernel linux-device-driver drivers

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

1 个答案:

答案 0 :(得分:2)

  

当进程B打开相同的特殊文件后,会发生什么   如果我理解正确的话,我们将有两个struct实例   file(两个指向同一结构文件的filp指针)。

这是错误的。每个open(2)都与一个struct file匹配。引自LDD3/Chapter3

  

文件结构代表一个打开的文件。 (这不是特定的   设备驱动程序;系统中的每个打开文件都有一个关联的结构   内核空间中的文件。)它是由内核在open上创建的   传递给任何对文件进行操作的函数,直到最后一个   关。关闭文件的所有实例后,内核将释放   数据结构。

要使两个进程共享相同的struct file,则必须具有父子关系,作为创建文件描述符副本的唯一方法(两个文件描述符指向同一个{{1} })是struct filefork(2)系统调用。

在您的情况下,由于每个dup(2)初始化open(2),并且进程A和B都称为struct C,因此它们不会通过open(2)共享struct C {1}}字段,因为它们与不同的private_data相关联。

他们分享并可能让您困惑的是struct inode