我正在研究launchd从/Library/LaunchDaemons/
下的plist文件或通过命令launchctl load
到目前为止,我已经设法收集了一些各种来源,并根据我的理解撰写了以下模糊的图片:
加载服务后(launchctl load
)进程launchctl
向launchd发送适当的XPC消息,然后将launchd
分叉到具有xpcproxy
上下文的新进程中。
这个通用过程正在等待来自launchd
的另一个XPC调用,以根据launchDaemon plst运行它的真实进程上下文。
这个解释听起来不错吗?也许有人可以帮我把它变得更准确吗?
谢谢
答案 0 :(得分:2)
这实际上有点复杂。内核由BSD和mach内核两部分组成;后者负责管理内存和进程调度。
每个马赫工艺都有一个或多个马赫任务(真正的任务端口权限!)。首次启动应用程序时,它只有一个权限,即引导端口,允许与launchd进行通信。请注意,任务端口权限是单向的,因此有权与launchd通信的启动过程必须为launchd提供与之通信的权限。
当launchd收到XPC消息时,它取决于启动守护进程它采取的操作。该消息可能是针对使用可能正在运行也可能未运行的网络端口运行的服务。如果正在运行,它会将任何参数从调用进程转发到正在运行的服务。如果没有运行,它可以通过首先启动流程来按需提供服务。
更具体地说,您询问了launchctl load
。由于launchd的源代码不再是开源的,下一个最好的资源是Jonathan Levin的逆向工程; Mac OS X and iOS Internals的作者以及最近他在*OS Internals上出版的新书。
你会发现他关于launchd here的幻灯片,但对他来说可能更有用的是他的launchctl版本,jlaunchctl open source。
最后,如果要在进程之间查看XPC消息的内容,请禁用SIP并使用Jonathan的宝贵XPoCe工具。