启动产生新进程的流程

Ira*_*d K 1 macos xpc launchd mach

我正在研究launchd从plist文件下/Library/LaunchDaemons/或通过命令加载它的服务的方式launchctl load

到目前为止,我已经设法收集了一些不同的来源,并按照我的理解组成了以下模糊的图片:

在服务加载时 ( launchctl load) 进程launchctl向launchd发送一条适当的XPC消息,然后将launchd其分叉到具有上下文的新进程中xpcproxy。这个通用进程正在等待来自 的另一个 XPC 调用launchd以根据 launchDaemon plst 运行它的真实进程上下文。

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

谢谢

The*_*ght 5

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

每个 mach 进程都有一个或多个 mach 任务(真正的任务端口权限!)。当应用程序第一次启动时,它只有一个权限,即引导端口,允许与 launchd 通信。请注意,任务端口权限是单向的,因此有权与 launchd 通信的启动进程必须授予 launchd 与其通信的权限。

当 launchd 收到 XPC 消息时,它取决于 Launch Daemon 采取什么行动。该消息可能是针对使用可能正在运行或可能未运行的网络端口运行的服务。如果正在运行,它会将来自调用进程的任何参数转发到正在运行的服务。如果没有运行,它可以通过先启动进程来按需提供服务。

更具体地说,您询问了launchctl load. 由于 launchd 的源代码不再是开源的,下一个最好的资源是 Jonathan Levin 的逆向工程工作;Mac OS X 和 iOS Internals 的作者,以及最近他自己出版的关于*OS Internals 的新书。

你可以在这里找到他关于 launchd 的幻灯片,但对你来说可能更有用的是他的 launchctl 版本,jlaunchctl开源的

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