在“应用程序”(或进程)级别进行清理很棘手,因为调用处理程序的进程上下文.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