启动了产生新流程的流程

Launchd flow of spawning new processes

我正在研究 launchd 从 /Library/LaunchDaemons/ 下的 plist 文件或通过命令 launchctl load

加载其服务的方式

到目前为止,我已经设法收集了一些不同的资源,并根据我的理解构成了以下模糊的画面:

服务加载时(launchctl load)进程 launchctl 向 launchd 发送一条适当的 XPC 消息,然后 launchd 分叉到上下文为 [=15 的新进程中=]. 这个通用进程正在等待从 launchd 到 运行 的另一个 XPC 调用,根据 launchDaemon plst,它是真正的进程上下文。

这个解释听起来对吗?也许有人可以帮我让它更准确吗?

感谢

这实际上有点复杂。内核由两部分组成,BSD和mach内核;后者负责内存管理和进程调度。

每个mach进程都有一个或多个mach任务(真的是任务端口权!)。当应用程序首次启动时,它只有一个权限,即 bootstrap 端口,允许与 launchd 进行通信。注意一个task的端口权限是uni-directional,所以一个有权限和launchd通信的launching进程,必须给launchd一个回传给它的权限。

当 launchd 接收到 XPC 消息时,它取决于启动守护进程采取什么操作。该消息可能是针对使用网络端口运行的服务,该端口可能是 运行,也可能不是 运行。如果 运行,它会将任何参数从调用进程转发到 运行 服务。如果不是运行,可以先启动进程,按需提供服务。

更具体地说,您询问了 launchctl load。由于 launchd 的源代码不再是开源的,下一个最好的资源是 Jonathan Levin 的逆向工程工作; Mac OS X and iOS Internals and more recently, his newer self-published books on *OS Internals 的作者。

您会找到他关于 launchd 的幻灯片 here, but probably more useful to you is his version of launchctl, jlaunchctl which is open source

最后,如果您想查看进程间 XPC 消息的内容,请禁用 SIP 并使用 Jonathan 的宝贵 XPoCe 工具。