2017-04-10 35 views
0

我正在研究一个内核模块,我需要“知道”给定的进程崩溃了。当用户进程终止/接收信号时中断内核模块?

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

我想知道是否有办法在内核模块中设置中断,当进程终止时,或进程收到给定信号(例如,SIGINT或SIGHUP)时该中断会关闭。

谢谢!

编辑:这里的一个前提条件是,我不能修改用户应用程序。或者至少,这将是一个更加艰难卖给如果我把额外的要求/约束​​的S/W来自其他供应商的客户...

回答

0

你可以有你的模块创建一个字符设备节点,然后打开该节点来自您的用户空间进程。只有大约十几行样板可以在您的模块中注册一个简单的cdev。当过程打开设备节点时,将调用cdev的open方法,并且在设备节点关闭时将调用release方法。如果某个进程有意或因信号退出,所有打开的文件描述符都会被内核关闭。所以你可以肯定release将被调用。这避免了轮询进程状态的任何需要,并且可以避免修改模块之外的任何内核代码。

你也可以设置一个监视系统风格,你的过程中必须每隔一段时间写一个字节到设备。有cdev的write方法重置一个计时器。如果没有写入并且计时器到期时间过长,则假定进程有某种失败,即使它没有崩溃并终止。例如一个编程错误,它允许互斥锁死锁或将进程置于无限循环中。

有在信号被传送到用户进程的内核代码的点。你可以修补它,检查进程名称,并发出一个条件变量,如果它匹配。这只会捕获信号,而不是有意的流程退出。恕我直言,这是非常丑陋的,你需要处理维护内核补丁。但并不难,只有一点,我不记得有什么功能,对不起,在哪里可以插入必要的代码,它会捕获所有的信号。

+0

谢谢!这里有一个问题,我应该提到:我无法修改用户应用程序。或者至少,这将是一个困难得多出售给客户,如果我把额外的要求/约束​​的S/W从其他供应商... 也许修补方法是值得看,但我想的复杂性与贸易如果由于周期性定时器中断导致的性能下降达到可接受性阈值,那么关闭将是值得的... –

+1

有一个封装器来启动应用程序并发信号给你的模块吗?如果子进程(应用程序进程)通过'waitpid()'等进程崩溃或退出,进程的父进程(即包装器)将得到通知。你甚至可以让包装打开驱动程序的设备节点,然后exec()应用程序,而不关闭设备节点。孩子将继承打开的文件描述符并保持打开状态,直到它关闭或终止。封装器不需要在启动应用程序之前存在。 – TrentP