Macos 启动产生新流程的流程

Macos 启动产生新流程的流程,macos,launchd,xpc,mach,Macos,Launchd,Xpc,Mach,我正在研究launchd如何从/Library/LaunchDaemons/下的plist文件或通过命令launchctl load加载其服务 到目前为止,我已设法收集了一些不同的资料来源,并根据我的理解撰写了以下模糊的图片: 在服务加载(launchctl load)时,流程launchctl向启动方发送一条适当的XPC消息,然后launchd被分叉到具有xpcproxy上下文的新流程中。 这个通用进程正在等待来自launchd的另一个XPC调用,以根据launchDaemon plst运行它

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

到目前为止,我已设法收集了一些不同的资料来源,并根据我的理解撰写了以下模糊的图片:

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

这个解释听起来对吗?也许有人能帮我把它弄得更准确些


谢谢

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

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

当launchd接收到XPC消息时,它取决于启动守护进程所采取的操作。消息可能是针对使用网络端口运行的服务的,该网络端口可能正在运行,也可能未运行。如果正在运行,它会将调用进程中的任何参数转发给正在运行的服务。如果没有运行,它可以通过首先启动流程按需提供服务

更具体地说,您询问了有关
启动ctl load
。由于launchd的源代码不再是开源的,下一个最好的资源是jonathanlevin的逆向工程工作;最近,他自己出版了一本关于这方面的新书

您将看到他关于launchd的幻灯片,但可能对您更有用的是他版本的launchctl,即


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

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

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

当launchd接收到XPC消息时,它取决于启动守护进程所采取的操作。消息可能是针对使用网络端口运行的服务的,该网络端口可能正在运行,也可能未运行。如果正在运行,它会将调用进程中的任何参数转发给正在运行的服务。如果没有运行,它可以通过首先启动流程按需提供服务

更具体地说,您询问了有关
启动ctl load
。由于launchd的源代码不再是开源的,下一个最好的资源是jonathanlevin的逆向工程工作;最近,他自己出版了一本关于这方面的新书

您将看到他关于launchd的幻灯片,但可能对您更有用的是他版本的launchctl,即

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