通过XPC与应用程序进行通信,并以root身份运行启动守护程序

时间:2014-05-08 21:22:35

标签: macos daemon xpc

是否可以与以root身份运行的启动守护程序和通过XPC运行的应用程序进行通信?当我的守护进程以我的用户身份运行时,我可以很好地与它通信,当以root身份运行时,它会停止接收我的消息。这是Mac OS X中的预期安全性吗? 我需要使用低级别的xpc(也用于在Lion上运行)。我知道我可以创建一个以我的应用程序为根运行的特权和签名帮助工具。我是否可以通过XPC或套接字与其他进程进行通信?

谢谢!

我的守护程序代码中的小提取:

int main()
{
    Logger::Start(Poco::Path::expand("/Users/Shared/Me/Service.log"));
    Logger::LogInfo("Starting xpc_main...");

    void* observer = nullptr;
    CFStringRef observedObject = CFSTR("com.me.service.close");
    CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter();
    CFNotificationCenterAddObserver(center, observer, notificationCallback, CFSTR("ClientClosing"), observedObject, CFNotificationSuspensionBehaviorDeliverImmediately);

    xpc_connection_t listener = xpc_connection_create_mach_service("com.me.service", NULL, XPC_CONNECTION_MACH_SERVICE_LISTENER);
    xpc_connection_set_event_handler(listener, ^(xpc_object_t event)
    {
        // New connections arrive here. You may safely cast to
        // xpc_connection_t. You will never receive messages here.
        // The semantics of this handler are similar to those of
        // of the one given to xpc_main().
        Logger::LogInfo("Event Handler on listener is called");

        eventHandler((xpc_connection_t)event);
    }); 

    Logger::LogInfo("call xpc_connection_resume...");

    xpc_connection_resume(listener);

    CFRunLoopRun();

    Logger::LogInfo("Main Program is Exiting...");

    return 0;
}

1 个答案:

答案 0 :(得分:0)

问题是 CFNotificationCenterGetDistributedCenter 仅适用于同一用户,root用户不会向其他登录用户发送消息..

您需要切换到 CFNotificationCenterGetDarwinNotifyCenter

但请注意,您无法使用此中心传递任何数据。