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

Linux kernel linux内核检查进程是否仍在运行,linux-kernel,kernel,pid,Linux Kernel,Kernel,Pid,我在内核空间工作,我想知道应用程序何时停止或崩溃。 当我收到一个ioctl调用时,我可以得到struct task_struct,在这里我有很多关于应用程序进程的信息。 我的问题是,我想定期检查进程是否仍然处于活动状态,或者更好,以便在进程终止时进行一些异步调用 我的测试环境在QEMU上,在应用程序中运行了一段时间后,我运行了一个系统(“kill-9PID”)。同时,在内核中,我对task_struct进行了定期检查: 易失性长状态;/*-1不可命名,0可运行,>0已停止*/ 静态内联整数pid

我在内核空间工作,我想知道应用程序何时停止或崩溃。 当我收到一个ioctl调用时,我可以得到struct task_struct,在这里我有很多关于应用程序进程的信息。 我的问题是,我想定期检查进程是否仍然处于活动状态,或者更好,以便在进程终止时进行一些异步调用

我的测试环境在QEMU上,在应用程序中运行了一段时间后,我运行了一个系统(“kill-9PID”)。同时,在内核中,我对task_struct进行了定期检查:
易失性长状态;/*-1不可命名,0可运行,>0已停止*/
静态内联整数pid_活动(结构任务_结构*p)

问题是我的任务结构指针似乎没有修改。通常我会说每个进程都有一个任务结构,当然它与进程状态是协同响应的。否则我就看不到“易失性长状态”的意义

我错过了什么?是因为我在QEMU上测试,还是因为我在一段时间内(1)用100的msleep检查了task_结构?任何帮助都将不胜感激

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


谢谢

我已经很久没有在内核里乱搞了。在我看来,如果你的进程真的死了,那么你最好的办法就是在代码中加入钩子,使进程崩溃。如果它没有死掉,但陷入了一个无响应的循环,那么最好是导致应用程序级核心转储

您不能将
task\u struct
指针分离出来,稍后再参考它。如果进程已终止,指针将不再有效-该
task\u struct
将消失。您也不应该在内核中使用PID值来引用进程。PID值被重复使用,因此您甚至可能不会谈论同一个过程


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

在我的操作系统作业中,一个非常有效的解决方案是使用kprobe来检测何时调用
do\u exit
。最美妙的是,无论进程如何关闭,都将始终调用
do\u exit
。我认为即使是在内核oops的情况下,这个仍然会被调用

为了以防万一,您还应该连接到
\u do\u fork

哦,看看另一个答案中提到的
.release
回调(请注意,
dup2
fork
将导致意外行为——只有当这两个副本创建的最后一个副本关闭时才会通知您)