据 Apple 介绍,Lion 中引入的新 XPC Services API 为与 Grand Central Dispatch (GCD) 和 launchd 集成的基本进程间通信提供了一种轻量级机制。
似乎可以使用这个 API 作为一种 IPC,就像 POSIX IPC,但是,我找不到如何做到这一点。
我正在尝试使用 XPC API 来通信两个进程,以便我可以在它们之间传递消息,但我总是在服务器端收到“XPC 连接无效”错误。
我不需要 XPC 服务,我只想使用客户端-服务器架构交换消息。
我正在使用两个类似 BSD 的进程,所以没有 Info.plist 或其他什么......
我一直在关注这个讨论http://lists.macosforge.org/pipermail/launchd-dev/2011-November/000982.html http://lists.macosforge.org/pipermail/launchd-dev/2011-November/000982.html但这个话题似乎有点晦涩难懂并且没有记录。
Thanks!
是的,这是可能的,但不是您期望的方式。
You can not有一个(非启动的)进程提供服务。这是出于安全原因,因为这使得中间人攻击变得很容易。
不过,您仍然可以实现您想要的目标:您必须设置一个启动服务来提供 XPC / mach 服务。然后进程 A 和 B 都连接到您启动的服务。然后进程A可以创建一个所谓的匿名连接并将其发送到 launchd 服务,该服务会将其转发给进程 B。一旦发生这种情况,进程 A 和 B 就可以通过该连接直接相互通信(即 launchd 服务可以退出而不会中断连接)。
这看似迂回,但出于安全原因这是必要的。
See the xpc_object(3)
有关匿名连接的详细信息的手册页。
这有点违反直觉,因为进程 A 将创建一个listener对象与xpc_connection_create()
。然后 A 创建一个endpoint来自侦听器的对象xpc_endpoint_create()
并通过线路(通过 XPC)将该端点发送到进程 B。然后 B 可以将该对象转换为与xpc_connection_create_from_endpoint()
。 A 的事件处理程序listener然后将收到一个与 B 创建的连接相匹配的连接对象xpc_connection_create_from_endpoint()
。这与事件处理程序的工作方式类似xpc_connection_create_mach_service()
当客户端连接时将接收连接对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)