在“应用程序”(或进程)级别进行清理很棘手,因为调用处理程序的进程上下文.release()
不一定与调用处理程序的进程上下文相同.open()
。(例如,调用的进程open()
可以派生一个子进程并退出,让子进程作为守护进程运行。)
我建议改为在“打开文件描述”级别进行清理。每个成功open()
的调用都会创建一个打开的文件描述,并且.release()
当不再引用该打开的文件描述时调用处理程序。您可以使用private_data
成员struct file
来指向.open()
处理程序分配的私有数据结构。该“打开文件特定”数据结构可以有一个成员指向您的设备特定的私有数据结构。
作为一个实际示例,我在“Comedi”子系统的内核代码中执行了上述操作。它的.open()
处理程序comedi_open()
(参见drivers/staging/comedi/comedi_fops.c)分配一个struct comedi_file
(struct file
的private_data
成员将指向的),并且struct comedi_file
包含指向dev
设备私有数据类型的指针(成员)struct comedi_device
。的其他成员struct comedi_file
包含的信息可能会在“每个打开的文件”的基础上有所不同,这些信息不会与open()
同一文件的其他成员共享。struct comedi_file
分配的 by 由处理程序comedi_open()
释放(我应该在某个时候重命名!)。.release()
comedi_close()
comedi_release