获得;“真正的”;如果进程使用launchd间接生成,则为父进程

获得;“真正的”;如果进程使用launchd间接生成,则为父进程,c,macos,launchd,xpc,C,Macos,Launchd,Xpc,我正在维护一个OSX工具,它显示从直接父进程到其最早祖先(通常是启动的)所选进程的父进程树 但是,如果所检查的进程通过双击bundle图标或使用命令open从bash运行进程等事件间接从launchd生成,则此进程链可能会断开。在这些情况下,我希望看到相应的bash或finder 也许XPC消息层就是答案,因为我假设这些事件是通过这种机制传递给launchd的。然而,其他可用的OSX框架总是受欢迎的 编辑: 我知道,如果进程在运行时自行分离,我无法恢复它的ppid,但我的目标是跟踪发起进程创建的

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

但是,如果所检查的进程通过双击bundle图标或使用命令
open
从bash运行进程等事件间接从launchd生成,则此进程链可能会断开。在这些情况下,我希望看到相应的
bash
finder

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

编辑:

我知道,如果进程在运行时自行分离,我无法恢复它的ppid,但我的目标是跟踪发起进程创建的调用方


谢谢

你看到的是正确的行为

当用户从Finder打开应用程序包时,或通过使用终端中的
open
命令,负责执行应用程序

当一个应用程序被引入到OSX/macOS中时,它将根据捆绑包的
Info.plist
文件中声明的捆绑包标识符在启动服务中注册

当用户双击或在终端中使用
open
时,Launch Services将接收捆绑标识并启动先前已注册的应用程序

应该注意,如果应用程序包的标识符不是唯一的,则可能会出现问题。使用两个具有相同版本和应用程序标识符的应用程序捆绑包,Launch Services将执行它注册的第一个应用程序,但它可能不是用户认为正在运行的应用程序

相反,如果使用终端直接执行应用程序包中的二进制文件,而不使用
open
,则其父应用程序将是终端使用的shell应用程序。例如:-

/Applications/Calculator.app/Contents/MacOS/Calculator

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

typedef pid_t (*pidResolver)(pid_t pid);

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

pid_t trueParentPid = resolver(pid);
a) 此方法是私有的

b) 它需要根权限

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

上面的代码片段将返回Safari进程的pid。当看到
“所有流程,分层”,其中“Safari网络”分组在“Safari”下

不完全确定你在寻找什么,但是如果一个过程分离它自己,它就有PID 1(init)作为它的直接父……我明白,当过程在生命的中间分离时,我不能获得PPID。但也许有一种方法可以在进程调用方刚刚从双击事件中产生时跟踪它,方法是跟踪finder和launchdhi之间的通信,并感谢您回答我的问题。我知道这是正确的行为,但我想知道是否有任何方法可以跟踪启动流程创建的实体,无论是“finder”双击事件还是“open”命令。从用户模式来看,没有。如果您真的确定,我希望您可以使用内核扩展来完成,但这远远超出了对SO问题的回答。如果有必要,我愿意写一个kext,但我认为要启动的消息不会经过内核,除非xpc经过mach消息。。也许你可以给我一些从哪里开始的一般指导方针?感谢LotusLaunchd正在处理它,我希望它是XPC,它是建立在mach消息之上的。launchd使用mach消息按需启动进程,这就是本例中发生的情况。您好,感谢您的贡献。这确实是一个伟大的象征,我想知道你是否知道它是如何运作的。。。它是否发送xpc来询问
launchd
有关父进程的问题?如果不是,则此父/子连接位于何处?符号来自libquantial.dylib,它在内核中调用quantial.kext以将此信息复制出进程。