哪个处理程序在 macos xpc 中处理来自服务器的回复

Posted

技术标签:

【中文标题】哪个处理程序在 macos xpc 中处理来自服务器的回复【英文标题】:which handler process the reply from server in macos xpc 【发布时间】:2021-04-28 13:48:54 【问题描述】:

我有以下 XPC 客户端的演示代码:

xpc_connection_t _connection = xpc_connection_create_mach_service("mac.xpc.service.name",
                                                                  NULL,
                                                                  XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
if (_connection == NULL) 
    printf("connect daemon xpc service failed\n");
    return;


xpc_connection_set_event_handler(_connection, ^(xpc_object_t obj) 
    //event_handler
);

xpc_connection_resume(_connection);

xpc_object_t message = xpc_dictionary_create(NULL, NULL, 0);
//create message here
//...

xpc_connection_send_message_with_reply(_connection, message, NULL, ^(xpc_object_t object) 
    //reply block
);

我可以连接到 xpc 服务并成功发送消息。 这里唯一的问题是事件处理程序始终正确接收到回复消息,但在回复块中,对象始终是 XPC_TYPE_ERROR。

我在这里有点困惑,因为我认为回复块应该接收正确的回复对象,因为它是为 xpc_connection_send_message_with_reply 显式声明的,但看起来事实并非如此。

谁能解释它是如何发生的以及如何确保回复块总是能得到正确的回复?

非常感谢您的回复。

谢谢!

【问题讨论】:

【参考方案1】:

我可以连接到xpc服务并成功发送消息。

创建连接实例并不意味着您连接到 XPC 服务。从xpc_connection_send_message_with_reply 函数返回并不意味着消息发送成功。除非您能够从 XPC 服务端确认您的消息已收到,否则我不会假设这就是实际发生的情况。

如果您尝试向不存在或无法启动的服务发送消息,则返回 XPC 错误是有意义的。


查看您的代码和您对“XPC 服务”的引用,我怀疑您的问题在 XPC_CONNECTION_MACH_SERVICE_PRIVILEGED 中传递。根据定义,XPC 服务不能获得特权,因此如果您确实拥有 XPC 服务,则不要传入此标志。如果您有一个以 root 身份运行并充当 XPC Mach 服务器的可执行文件/应用程序,那么这不太可能是您的问题。

【讨论】:

以上是关于哪个处理程序在 macos xpc 中处理来自服务器的回复的主要内容,如果未能解决你的问题,请参考以下文章

XPC 和异常处理

非常简单的 macOS XPC

XPC 连接如何以线程方式处理?

macOS XPC 服务未启动

XPC 到 XPC 通信

如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?