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

linux kernel check if process is still running

我正在内核空间中工作,我想找出应用程序何时停止或崩溃。
当我收到一个ioctl调用时,可以获得结构task_struct,其中有很多有关应用程序过程的信息。
我的问题是我想定期检查该进程是否仍然存在或更好,以便在进程被终止时进行一些异步调用。

我的测试环境在QEMU上,在应用程序中运行了一段时间后,我运行了一个系统(" kill -9 pid")。同时,在内核中,我对task_struct进行了定期检查,内容如下:
易挥发的长状态; / * -1不可运行,0可运行,> 0已停止* /
静态内联int pid_alive(struct task_struct * p)

问题是我的task_struct指针似乎未修改。通常我会说每个进程都有一个task_struct,当然它是进程状态的核心发起者。否则我看不到"不稳定的长期状态"

我想念什么?是否正在QEMU上进行测试,是否已经测试过while(1)中msleep为100的task_struct检查?任何帮助,将不胜感激。

如果我在关闭模块的文件描述符(" / dev / driver")时能够收到应用程序的pid,我会感到部分满意。

谢谢!


您不能脱离task_struct指针,以后再引用它。如果该进程已被终止,则指针不再有效-task_struct消失了。您也不应在内核中使用PID值来引用进程。 PID值被重新使用,因此您甚至可能不在谈论同一过程。

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


自从我将内核混入内核以来已经有很长时间了。在我看来,如果您的进程实际上死了,那么最好的选择就是将钩子插入破坏进程的代码中。如果它没有死,但是陷入了无响应的循环中,则最好进行应用程序级核心转储。