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

时间:2016-01-20 11:42:20

标签: macos sockets kernel kernel-extension

我正在使用Kernel Control API(SYSPROTO_CONTROL)用户域应用程序根据Apple's documentation中的代码从内核扩展中请求信息。

所有工作都按预期使用单个连接的客户端。如果第二个客户端在连接第一个客户端时尝试连接,则会失败并显示以下消息: -

  

错误16(资源忙)。

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

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

1 个答案:

答案 0 :(得分:1)

我不知道是否可能,但是推荐的方法是始终只拥有一个与一个内核扩展进行对话的用户空间客户端,该客户端扩展通常是在用户空间中运行并由launchd启动的后台守护程序。如果您希望多个其他应用程序或进程从您的内核扩展中访问数据或以某种方式与之交互,则这些应用程序或进程将与用户空间守护程序对话,而不是直接与内核扩展对话,后者还可以在跨用户时将数据缓存在用户空间中空间/内核空间桥对于数据而言总是很昂贵的,因此当10个进程都需要相同的数据时,最好从内核中提取一次,然后使用您选择的任何IPC机制将其在用户空间中分发10次。

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

对于SMJobBless示例项目,see here