我正在研究launchd如何从/Library/LaunchDaemons/下的plist文件或通过命令launchctl load加载它的服务
到目前为止,我已经收集了一些不同的来源,并撰写了以下我所理解的模糊图片:
在服务加载( Service,launchctl load)时,流程launchctl向启动发送发送一个适当的XPC消息,然后将launchd分叉到具有xpcproxy上下文的新进程中。这个通用进程正在等待来自launchd的另一个XPC调用来根据launchDaemon plst运行它的真实进程上下文。
这个解释听起来对吗?也许有人能帮我让它更准确?
谢谢
发布于 2018-03-13 16:04:52
这实际上要复杂一些。内核由BSD和mach内核两部分组成,后者负责内存管理和进程调度。
每个mach进程都有一个或多个mach任务(实际上是任务端口权限!)。当应用程序第一次启动时,它只有一个权限,即引导端口,允许与launchd通信。请注意,任务端口权限是单向的,因此有权与launchd通信的启动过程必须给launchd返回通信的权限。
当launchd接收到XPC消息时,它取决于启动守护进程所采取的操作。这条消息有可能是一个服务的消息,该服务的网络端口可能正在运行,也可能没有运行。如果正在运行,则将调用进程的任何参数转发给正在运行的服务。如果不运行,它可以通过首先启动流程来提供按需服务。
更具体地说,您询问了有关launchctl load的内容。由于launchd的源代码不再是开源的,接下来最好的资源是Jonathan的反向工程工作,他是Mac和iOS内部设备的作者,最近,他又出版了一本关于OS内部的新书。
您可以找到他关于launchd 这里的幻灯片,但可能对您更有用的是他的launchctl版本,jlaunchctl,也就是开源。
最后,如果您想在进程之间查看XPC消息的内容,请禁用SIP并使用乔纳森的宝贵的XPoCe工具。
https://stackoverflow.com/questions/49231968
复制相似问题