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

Posted

技术标签:

【中文标题】通过 XPC 与应用程序通信并启动以 root 身份运行的守护程序【英文标题】:Communicating over XPC with an app and launch daemon running as root 【发布时间】:2014-05-08 21:22:34 【问题描述】:

是否可以与以 root 身份运行的启动守护程序和通过 XPC 的应用程序进行通信?当我的守护进程以我的用户身份运行时,我可以与它正常通信,当以 root 身份运行时,它会停止接收我的消息。这是 Mac OS X 内部的预期安全性吗? 我需要使用低级 xpc(也可以在 Lion 上运行)。我知道我可以为我的应用程序创建一个以 root 身份运行的特权和签名的帮助工具。我能否通过 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;

【问题讨论】:

有人有什么想法吗? XPC 不是必需的,只需要运行一个能够与 2 个进程通信的全局守护进程。 不是一个想法,但我目前处于类似情况,想知道您是否可以提供指导......我需要一种方法来启动我的守护进程。我的意思是我有一个网站,当发生 BTN 点击时,我想向守护进程发送一条消息以执行。任何想法或建议将不胜感激。 【参考方案1】:

问题是 CFNotificationCenterGetDistributedCenter 只对同一个用户有效,root 用户不会向其他登录用户发送消息..

您需要切换到 CFNotificationCenterGetDarwinNotifyCenter

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

【讨论】:

以上是关于通过 XPC 与应用程序通信并启动以 root 身份运行的守护程序的主要内容,如果未能解决你的问题,请参考以下文章

谈谈Mac进程间通信--XPC

使用 XPC 与另一个应用程序通信

服务和客户端应用程序之间的 XPC 通信仅在从 xcode 启动时才有效

有没有办法通过 XPC 传递任意结构?

XPC 到 XPC 通信

XPC 服务未从 Xcode 源代码编辑器扩展启动(`仍然很忙`)