例如,我有两个尝试打开特殊文件(/dev/example
)的进程A和B.驱动程序有一个open方法,用于初始化结构(struct c
)并将其传递给filp->private_data
。如果之后进程B打开相同的特殊文件,会发生什么如果我理解正确,我们将有两个struct文件实例(两个指向同一结构文件的filp指针)。 open方法是否会再次初始化struct C
并将其传递给filp->private_data
,并且一个进程初始化后会发生什么?
答案 0 :(得分:2)
当进程B打开相同的特殊文件后,会发生什么 如果我理解正确的话,我们将有两个struct实例 file(两个指向同一结构文件的filp指针)。
这是错误的。每个open(2)
都与一个struct file
匹配。引自LDD3/Chapter3:
文件结构代表一个打开的文件。 (这不是特定的 设备驱动程序;系统中的每个打开文件都有一个关联的结构 内核空间中的文件。)它是由内核在open上创建的 传递给任何对文件进行操作的函数,直到最后一个 关。关闭文件的所有实例后,内核将释放 数据结构。
要使两个进程共享相同的struct file
,则必须具有父子关系,作为创建文件描述符副本的唯一方法(两个文件描述符指向同一个{{1} })是struct file
或fork(2)
系统调用。
在您的情况下,由于每个dup(2)
初始化open(2)
,并且进程A和B都称为struct C
,因此它们不会通过open(2)
共享struct C
{1}}字段,因为它们与不同的private_data
相关联。
他们分享并可能让您困惑的是struct inode
。