我正在编写一个linux内核驱动程序,它创建一个char设备文件"/dev/my_ file“。多个用户空间应用程序对该文件执行open(),并使用提供的ioctl命令来注册应用程序特定的数据。IOCTL还提供了取消注册命令,当执行干净的退出时,应用程序可以使用和取消注册(内核drv删除应用程序数据,删除任何内存分配等)。但是,如果应用程序在执行open()和ioctl注册命令后被终止。驱动程序如何检测哪个应用程序被杀死,然后执行清理任务以删除应用程序特定的数据。我知道来自struct file_operations的.release func ptr被调用并通知了驱动程序,但不确定drv如何找到被杀死的特定应用程序。
感谢Sheetal
发布于 2021-01-28 22:30:21
在“应用程序”(或进程)级别上进行清理很棘手,因为调用.release()处理程序的进程上下文不一定与调用.open()处理程序的进程上下文相同。(例如,调用open()的进程可以派生一个子进程并退出,让该子进程作为守护进程运行。)
我建议改为在“打开文件描述”级别上进行清理。每个成功的open()调用都会创建一个打开的文件描述,并且当不再有对该打开的文件描述的引用时,就会调用.release()处理程序。可以使用struct file的private_data成员指向由.open()处理程序分配的私有数据结构。“特定于打开文件”数据结构可以有一个指向特定于设备的私有数据结构的成员。
作为一个实际示例,我在"Comedi“子系统的内核代码中执行了上述操作。它的.open()处理程序comedi_open() (请参阅drivers/staging/comedi/comedi_fops.c)分配一个struct comedi_file (struct file的private_data成员将指向该成员),并且该struct comedi_file包含指向struct comedi_device类型的设备私有数据的指针(成员dev)。D17的其他成员包含的信息可以在“每个打开的文件”的基础上变化,不能与同一文件的其他D18共享。由D20分配的struct comedi_file由.release()处理程序comedi_close()释放(以后我应该将其重命名为D23!)。
https://stackoverflow.com/questions/65937202
复制相似问题