通过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?
答案 0 :(得分:3)
AIUI这是由Mach命名空间层次结构引起的。您的主程序将在用户会话命名空间中注册其NSConnection,而LaunchDaemon在全局上下文中运行,因此它无法查看任何会话命名空间。请注意,当您使用sudo运行帮助程序时,它仍会在会话上下文中运行,即使它以root身份运行。请参阅tn2083,尤其是“执行上下文”和“守护程序IPC建议”部分。
您可能能够从LaunchDaemon提供连接并从主程序连接(因为会话命名空间继承自全局命名空间),但最好完全切换到不同的机制。作为奎因“爱斯基摩人!”在this message中指出,使用安全域之间的分布式对象(如用户程序和以root身份运行的守护进程)使得很难进行正确的输入验证,因此很可能导致安全漏洞。