检测用户空间模块是否无法从Linux驱动程序中死亡

时间:2014-11-27 18:44:25

标签: linux linux-kernel driver

我有一个Linux驱动程序,允许用户空间应用程序注册一些特定于应用程序的数据,这将影响驱动程序的运行方式。通常,用户空间应用程序将在退出之前注销其信息。但是,如果应用程序崩溃,则无法取消注册信息,并且会出现内存泄漏。我想知道是否有可能从内核空间中检测到用户空间应用程序是否已意外退出。

2 个答案:

答案 0 :(得分:2)

struct task_struct * task = current;会给你指向当前任务的指针。 task-> comm和task-> pid将给出进程的名称和PID。当用户空间应用程序调用驱动程序注册其数据时(假设您使用的是字符设备接口,写入),您可以将pid添加到列表中。运行一个计时器,每当计时器到期时,在回调中,再次将任务指针初始化为当前并通过task = task->进入循环链表,直到任务再次变为当前状态并查看列表中的所有pid是否仍然存在于内核任务列表中。如果您发现任何遗漏,

答案 1 :(得分:0)

除了我之前的答案中的方法,您可以使用find_task_by_vpid(pid);直接获取任务的任务结构,而不是轮询。评论说必须在rcu_read_lock()下调用。

另一种选择是在应用程序和内核模块之间实现通用的netlink套接字通信。这里应用程序必须响应内核消息。与第一种方法相比,这将是更多的工作,如果find_task_by_vpid()返回NULL,您可以断定您的用户空间进程已经死亡。