1

在内核扩展中启动和退出进程时收到通知的最佳方式是什么?

我知道我可以用它KAuth来订阅一个进程创建(KAUTH_VNODE_EXECUTE)。订阅进程清理怎么样?

4

2 回答 2

2

KAUTH_VNODE_EXECUTE 对所有进程来说都不够用;这不会捕获没有 exec() 的 fork() 进程。在 OSX 上相当罕见,但并非闻所未闻。至少,fork 有一个 MAC 框架策略回调,尽管 MAC (com.apple.kpi.dsep) 被 Apple 标记为不支持,并且主要 OS X 版本之间的 ABI 更改很常见。

除了定期浏览您自己的进程列表、查找相关 PID 的 proc_t 并检查它是否仍然存在之外,我不知道任何需要关闭的东西。当然,如果检测到一个具有回收PID的新进程,那也意味着之前具有相同PID的进程已经死亡。如果您有有关进程的额外信息,您可能能够从其他事件中推断出进程死亡。

于 2015-09-16T13:32:27.440 回答
1

还有一种方法可以在退出时监控进程。您可以使用内核事件通知机制 (kevent),它是 freeBSD 的一部分并受 OS X 支持。

流程开始于进程启动(您可以使用 kauth 或 mac 框架方法捕获)。在回调函数中,您需要注册适当的事件以便稍后监控。这是通过使用带有以下参数的 EV_SET 设置 kevent 实例来完成的:

kevent.ident = pid
kevent.filter = EVFLT_PROC
kevent.flags = EV_ADD
kevent.fflags = NOTE_EXIT

在代码中它应该是这样的:

EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
kevent(kq, &ke, 1, NULL, 0, NULL);  // registration of ke to kqueue represented by kq descriptor. 

最后,您将需要另一个线程来监听这些事件并在时间到来时捕获它们(进程退出),再次使用 kevent 命令。

err = kevent(kq, NULL, 0, &ke, 1, NULL);
if (err == -1)
   err(1, "error in catching the event");

if (ke.fflags & NOTE_EXIT)
    printf("this is what you need ..."); 

有关更多详细信息,您可以查看以下文档

于 2016-05-17T12:33:44.277 回答