获取“真实”父进程,以防使用 launchd 间接生成进程

Zoh*_*r81 4 c macos xpc launchd

我正在维护一个 OSX 工具,它显示选定进程的父树,从直接父进程到其最早的祖先(通常是 launchd)。

但是,如果检查的进程是使用诸如双击捆绑包图标之类的事件从 launchd 间接生成的,或者使用 command 从 bash 运行进程,则该进程链可能会中断open。在这些情况下,我希望看到其中一个bashfinder相应的。

也许 XPC 消息传递层就是答案,因为我假设这些事件通过此机制传递到 launchd。然而,其他可用的 OSX 框架总是受欢迎的。

编辑:

我知道,如果一个进程在运行时自行分离,我无法恢复它的 ppid,但我的目标是跟踪启动进程创建的调用者。

谢谢

小智 8

此功能未记录。它可能会在任何操作系统更新时中断。

typedef pid_t (*pidResolver)(pid_t pid);

pidResolver resolver = dlsym(RTLD_NEXT, "responsibility_get_pid_responsible_for_pid");

pid_t trueParentPid = resolver(pid);
Run Code Online (Sandbox Code Playgroud)

a) 这个方法是私有的

b) 需要root权限

例如:如果您启动 Safari.app,还会创建一个名为“Safari Networking”的新进程。如果您在活动监视器中检查它,您只会看到 ppid 为 1。

上面的代码片段将返回 Safari 进程的 pid。正如在查看“所有进程,层次结构”时所看到的,其中“Safari Networking”被分组在“Safari”下。