0

我正在编写一个 linux 内核驱动程序,它创建一个字符设备文件“/dev/my_file”。多个用户空间应用程序执行open()此文件并使用ioctl提供的 cmd 来注册应用程序特定数据。IOCTL 还提供了注销 cmd,在执行干净退出时,应用程序可以使用和注销自己(内核驱动程序删除应用程序数据,删除任何内存分配等)。但是,如果应用程序在执行open()ioctl注册 cmd 后被杀死。驱动程序如何检测哪个应用程序被杀死,然后执行清理任务以删除应用程序特定数据。我知道调用了.releasefunc ptrstruct file_operations并通知了驱动程序,但不确定驱动程序如何找到被杀死的特定应用程序。

谢谢Sheetal

4

1 回答 1

0

在“应用程序”(或进程)级别进行清理很棘手,因为调用处理程序的进程上下文.release()不一定与调用处理程序的进程上下文相同.open()。(例如,调用的进程open()可以派生一个子进程并退出,让子进程作为守护进程运行。)

我建议改为在“打开文件描述”级别进行清理。每个成功open()的调用都会创建一个打开的文件描述,并且.release()当不再引用该打开的文件描述时调用处理程序。您可以使用private_data成员struct file来指向.open()处理程序分配的私有数据结构。该“打开文件特定”数据结构可以有一个成员指向您的设备特定的私有数据结构。

作为一个实际示例,我在“Comedi”子系统的内核代码中执行了上述操作。它的.open()处理程序comedi_open()(参见drivers/staging/comedi/comedi_fops.c)分配一个struct comedi_filestruct fileprivate_data成员将指向的),并且struct comedi_file包含指向dev设备私有数据类型的指针(成员)struct comedi_device。的其他成员struct comedi_file包含的信息可能会在“每个打开的文件”的基础上有所不同,这些信息不会与open()同一文件的其他成员共享。struct comedi_file分配的 by 由处理程序comedi_open()释放(我应该在某个时候重命名!)。.release()comedi_close()comedi_release

于 2021-01-28T14:30:21.380 回答