linux内核检查进程是否仍在运行

时间:2013-07-22 19:24:54

标签: linux-kernel kernel pid

我在内核空间工作,我想知道应用程序何时停止或崩溃。 当我收到ioctl调用时,我可以获取struct task_struct,其中有很多关于应用程序进程的信息。 我的问题是我想定期检查进程是否还活着还是更好,在进程被杀死时进行一些异步调用。

我的测试环境在QEMU上,在应用程序中运行了一段时间后我运行了一个系统(“kill -9 pid ”)。同时在内核中我对task_struct进行了定期检查: 挥发性长状态; / * -1 unrunnable,0 runnable,> 0停止* /
static inline int pid_alive(struct task_struct * p)

问题是我的task_struct指针似乎未经修改。通常我会说每个进程都有一个task_struct,当然它与进程状态是一致的。否则我没有看到“挥发性长状态”的重点

我错过了什么?是不是我在QEMU上进行测试,是因为我已经测试了在一段时间(1)中检查task_struct,其中msleep为100?任何帮助将不胜感激。

如果我在应用程序关闭模块的文件描述符(“/ dev / driver”)时能够收到应用程序的pid,我会感到很高兴。

谢谢!

3 个答案:

答案 0 :(得分:1)

您无法关闭task_struct指针并稍后再参考。如果进程已被终止,则指针不再有效 - task_struct 已消失。您也不应该在内核中使用PID值来引用进程。 PID值被重复使用,因此您甚至可能不会讨论相同的过程。

您的驱动程序可以提供.release回调,当您的驱动程序文件关闭时将调用该回调,包括进程被终止或终止。您可以从此回调中访问current。请注意,如果进程打开您的文件然后分叉,则调用.release的进程可能与调用.open的进程不同。你的司机必须能够处理这个问题。

答案 1 :(得分:0)

自从我在内核中捣乱已经有很长一段时间了。在我看来,如果你的进程实际上死了,那么你最好的办法就是将钩子放入拆除进程的代码中。如果它没有消失但被一个无响应的循环捕获,你可能最好导致应用程序级核心转储。

答案 2 :(得分:0)

一个在我的操作系统作业中效果很好的解决方案是使用kprobe检测何时调用do_exit。美妙的是,无论关闭过程如何,都将始终调用do_exit。我认为即使在内核出现问题的情况下,仍会调用该内核。

为了以防万一,您还应该加入_do_fork

哦,看看另一个答案中提到的.release回调(请注意dup2fork会导致意外的行为-只有在最后一个这两个创建的副本已关闭)。