用户进程终止/接收信号时中断内核模块?

时间:2017-04-10 16:35:24

标签: linux-kernel signals interrupt kernel-module terminate

我正在研究内核模块,我需要“意识到”某个进程已崩溃。

现在我的方法是在内核模块中设置一个周期性的定时器中断;在每个定时器中断,我检查该进程的task_struct.state和task_struct.exitstate值。

我想知道是否有一种方法可以在内核模块中设置一个中断,当进程终止时,或者当进程收到一个给定的信号(例如,SIGINT或SIGHUP)时,该中断就会消失。

谢谢!

编辑:这里的一个问题是我无法修改用户应用程序。或者至少,如果我对来自其他供应商的s / w提出额外的要求/约束​​,对客户来说会更加艰难......

1 个答案:

答案 0 :(得分:0)

您可以让模块创建一个字符设备节点,然后从用户空间进程打开该节点。在你的模块中注册一个简单的cdev只需要十几行样板。当进程打开设备节点时,将调用cdev的open方法,并在关闭设备节点时调用release方法。如果进程有意或由于信号而退出,则所有打开的文件描述符都由内核关闭。因此,您可以确定将调用release。这样就不需要轮询进程状态,也可以避免修改模块外部的任何内核代码。

您还可以设置一个看门狗样式系统,您的进程必须经常向设备写入一个字节。让cdev的write方法重置计时器。如果没有写入太多时间并且计时器到期,则假定该进程以某种方式失败,即使它没有崩溃并终止。例如,编程错误允许互斥锁死锁或将进程置于无限循环中。

内核代码中有一点可以将信号传递给用户进程。您可以修补它,检查进程名称,并在条件变量匹配时发出信号。这只会捕获信号,而不是故意的过程退出。恕我直言,这是更加丑陋的,你需要处理维护内核补丁。但这并不难,有一点,我不记得是什么功能,对不起,人们可以插入必要的代码,它会捕获所有信号。