我在内核空间工作,我想知道应用程序何时停止或崩溃 . 当我收到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 回答
您无法关闭
task_struct
指针并在以后引用它 . 如果进程已被终止,则指针不再有效 -task_struct
已消失 . 您也不应该在内核中使用PID值来引用进程 . PID值被重复使用,因此您甚至可能不会谈论相同的过程 .您的驱动程序可以提供
.release
回调,当您的驱动程序文件关闭时将调用该回调,包括该进程被终止或终止 . 您可以从此回调访问current
. 请注意,如果进程打开您的文件然后分叉,则调用.release
的进程可能与调用.open
的进程不同 . 您的驱动程序必须能够处理此问题 .自从我在内核中乱逛已经很久了 . 在我看来,如果你的进程真的死了,那么你最好的办法就是把钩子放到代码中去掉进程 . 如果它没有't die but gets caught in a non-responsive loop, you'可能会更好地导致应用程序级核心转储 .