icd*_*ppl 5 c module process linux-kernel
我正在编写一个监视正在运行的进程的 Linux 模块,并且希望在创建新进程时收到通知。
我一直在研究,我了解到可以读取/proc/some-id来获取进程信息,但 inotify 不会报告 /proc 的更改,因为它是一个虚拟文件系统。它仅在阅读时提供信息。
以下是我的发现,以防有人也试图解决类似的问题:
1. pnotify(进程通知)
链接: http: //lwn.net/Articles/153187/这是最接近我想做的事情,但是它是在 2005 年发布的,似乎没有进入 Linux 发行版。这个想法是让 pnotify 与 inotify 相邻,并为进程监控提供类似的支持。
2.过程连接器
这个解决方案实际上是用户空间的。它使用 PF_NETLINK 与任何新创建的进程的内核进行通信。
3.扫描task_struct
与 2 类似,但此解决方案使用以下命令扫描内核中的任务列表以查找新进程
for_each_task(task)
Run Code Online (Sandbox Code Playgroud)
proc 信息写入字符设备。用户空间应用程序将通过读取字符设备来轮询新信息。
说实话,我仍然希望 linux 有一些像 Windows 的PsSetCreateProcessNotifyRoutine一样的机制:-/
实现 SE Linux 安全模块并使用在 上下文中调用的 .task_create 等挂钩fork()
,或者在调用过程中的各个点调用的一个或多个 .bprm_* 挂钩execv()
。
看这里:
http://en.wikipedia.org/wiki/Linux_Security_Modules
和这里:
http://selinuxproject.org/page/NB_LSM
这里有一个例子:
http://lxr.free-electrons.com/source/security/selinux/hooks.c
您需要做的大部分事情只是一个传递,在钩子之外,您可以在fork()
以下情况下将其用作通知:execv()
调用
只要确保正确链接您的模块即可。