首页 文章

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

提问于
浏览
2

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

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

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

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

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

谢谢!

2 回答

  • 1

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

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

  • 0

    自从我在内核中乱逛已经很久了 . 在我看来,如果你的进程真的死了,那么你最好的办法就是把钩子放到代码中去掉进程 . 如果它没有't die but gets caught in a non-responsive loop, you'可能会更好地导致应用程序级核心转储 .

相关问题