2

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

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

问题是我的 task_struct 指针似乎没有被修改。通常我会说每个进程都有一个task_struct,当然它与进程状态是对应的。否则我看不到“不稳定的长期状态”的意义

我错过了什么?是我在 QEMU 上进行测试,还是我在一段时间内(1)测试了 task_struct 并且 msleep 为 100?任何帮助,将不胜感激。

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

谢谢!

4

3 回答 3

1

您不能将task_struct指针分开并稍后引用它。如果进程已被杀死,则指针不再有效——即task_struct消失。您也不应该在内核中使用 PID 值来引用进程。PID 值被重复使用,因此您甚至可能不是在谈论同一个过程。

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

于 2013-07-23T04:14:49.673 回答
0

It has been a long time since I mucked around inside the kernel. It seems to me if your process actually dies, then your best bet would be to put hooks into the code that tears down processes. If it doesn't die but gets caught in a non-responsive loop, you'd probably be better off causing an application level core dump.

于 2013-07-22T19:41:58.673 回答
0

在我的操作系统作业中运行良好的解决方案是使用 kprobe 来检测何时do_exit调用。美妙之处在于do_exit,无论流程如何关闭,它都会被调用。我认为即使在内核 oops 的情况下,它仍然会被调用。

_do_fork以防万一,您还应该挂钩。

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

于 2020-03-24T14:48:47.133 回答