内核控制 API 可以支持多个同时的客户端连接吗?

Can Kernel Control API support multiple, simultaneous client connections?

我正在使用 Kernel Control API (SYSPROTO_CONTROL) for a user-land application to request information from a kernel extension, based on the code in Apple's documentation

所有连接的客户端均按预期工作。如果第二个客户端在第一个连接时尝试连接,它将失败并显示消息:-

Error 16 (Resource busy).

然后自动断开第一个客户端。

是否可以使用内核控制连接两个客户端API,如果不能,最好的解决方案是在资源繁忙时继续尝试连接吗?

我不知道这是否可能,但推荐的方法是始终只有一个用户 space 客户端与一个内核扩展对话,通常是一个后台守护进程 运行ning 在用户中space 并由 launchd 开始。如果您希望多个其他应用程序或进程从您的内核扩展访问数据或以某种方式与之交互,那么这些应用程序或进程将与用户 space 守护进程对话,而不是直接与内核扩展对话,内核扩展也可以在用户 space 中缓存数据=29=] 因为跨用户 space/kernel space bridge 对于数据总是很昂贵,所以当 10 个进程都想要相同的数据时,最好只从内核中拉出一次然后分发使用您选择的任何 IPC 机制在用户 space 中使用 10 次。

建议使用此设置,因为您应该将内核控制限制在根进程(使用 CTL_FLAG_PRIVILEGED 标志),这样您的守护进程将 运行 作为根进程,而正常的应用程序和进程 运行具有当前用户的权限。这样的根助手守护进程可以捆绑在应用程序包中并使用 SMJobBless API,守护进程会自动复制到 /Library/PrivilegedHelperTools 并且它是嵌入式 plist(请参阅 SMJobBless 文档,仅在其头文件 AFAIK 中可用)被复制到 /Library/LaunchDaemons 并注册到 launchd。在这样的 plist 中,当守护程序应由 launchd 启动时,您可以使用各种触发器,例如当您的应用程序尝试连接到特定的 IPC UNIX 套接字时。然后你在你的应用程序中所要做的就是尝试打开那个套接字,launchd 会检测并为你启动守护进程,然后它可以使用 launchd 的 API 来获取那个连接的套接字并立即开始与你的对话应用程序。所以整个东西只安装一次,然后每次你的应用程序启动时都会自动出现。

对于 SMJobBless 示例项目,see here