launchd:Mach服务查找失败

时间:2012-01-12 12:10:57

标签: objective-c macos cocoa launchd

通过launchd获得root权限的帮助工具无法为我的主程序建立NSConnection。

当我使用sudo手动启动HelperTool时,连接有效,这证明我的服务很好,并且问题来自launchd。

日志是:

12.01.12 12:41:07    Debou[8247]    [CaptureQueue startCaptureQueueThread] Launched NSConnection service Debou-CaptureQueueThread - (** NSConnection 0x100522090 receivePort <NSMachPort: 0x1005511d0> sendPort <NSMachPort: 0x1005511d0> refCount 1 **)
12.01.12 12:41:10    com.apple.launchd[1]    System: Looking up service Debou-CaptureQueueThread
12.01.12 12:41:10    com.apple.launchd[1]    (com.Debou.PacketTool[8260]) Mach service lookup failed: Debou-CaptureQueueThread 

为什么launchd无法看到我推出的NSConnection?

1 个答案:

答案 0 :(得分:3)

AIUI这是由Mach命名空间层次结构引起的。您的主程序将在用户会话命名空间中注册其NSConnection,而LaunchDaemon在全局上下文中运行,因此它无法查看任何会话命名空间。请注意,当您使用sudo运行帮助程序时,它仍会在会话上下文中运行,即使它以root身份运行。请参阅tn2083,尤其是“执行上下文”和“守护程序IPC建议”部分。

您可能能够从LaunchDaemon提供连接并从主程序连接(因为会话命名空间继承自全局命名空间),但最好完全切换到不同的机制。作为奎因“爱斯基摩人!”在this message中指出,使用安全域之间的分布式对象(如用户程序和以root身份运行的守护进程)使得很难进行正确的输入验证,因此很可能导致安全漏洞。