6

我正在尝试将 Wine 1.7.13 移植到现代可可。我正在考虑在 XPC 服务的进程中运行 Windows 二进制文件,以实现安全隔离和防崩溃。但是,有一个问题:据我所知,XPC 服务是单例的。一次只允许运行一个 XPC 服务进程。这是一个问题,因为如果我使用线程来使多个 Windows 二进制文件同时运行,一个 Windows 二进制文件中的段错误或其他硬崩溃导致所有其他二进制文件随之崩溃。

就像这里提到的,一般来说,上面的断言是正确的。如果是这样,我似乎无法在单个 XPC 服务进程中实现这种隔离。

我的另一种选择是使用沙盒继承(使用 GUI 应用程序分支并使用更传统的 IPC 让 Windows 进程相互通信)而不是 XPC 服务。使用它而不是 XPC 服务的优缺点是什么?我了解继承其父沙箱的进程不会拥有自己的权利。还有哪些缺点?

我也理解 Apple 不鼓励使用沙盒继承来支持 XPC,但这仍然是一个可用的设计决策。他们一定是有原因的。沙盒化的 Mac App Store 应用程序能否以这种方式使用沙盒继承?

4

1 回答 1

2

我正在经历同样的决定。我一心想着 XPC 服务,但是当发现会有一个 XPC 服务有多个连接时,我无法使用它们(我的 XPC 服务将使用第三方提供的插件,所以我想将它们分开,而且 XPC 服务将使用可能无法正确清理的库,因此我希望能够在保持 UI 稳定的同时处理它们 - 好吧我不应该证明这一点 - 我想要一个进程每个 -工作,就是这样)。

我正在考虑使用普通的子流程模型posix_spawn()(我认为fork()这比WRT 对沙盒的表现更好),用于通信的CocoaAsyncSocket我将看看是否可以将 CocoaAsynSocket 中的 TCP/IP 的使用替换为 UNIX 套接字以加快通信速度(如果可行,则打算将其回馈给项目)。更新:这已经由 github 用户 @jdiehl 完成。请参阅他的socketUN分支上游 repo 的 issue #88 中的讨论)。

对于数据编组,我将使用Google 协议缓冲区更新 #2:不;不值得麻烦时NSKeyedArchiver提供NSKeyedUnarchiver开箱即用所需的一切。他们可能不会提供像 Google 协议缓冲区那样打包的数据,但他们 1)不要不需要编写和维护,2)通过实现NSCoding协议允许任何类参与,3)不必解决跨平台数据交换的问题。

我能看到的唯一可能的缺点是我不知道是否可以将文件书签传递给子进程并使用(即 UI 打开文件或将文件拖到其中并希望将文件访问权限授予工作进程)。我会用我学到的任何东西来更新这个答案。最终更新:通过 UNIX 域套接字传递 URL 书签可以正常工作,并且书签甚至不需要是安全范围的书签即可工作。对于 XPC 的替代方案没有更多障碍)。

您关于没有自己权利的子流程的断言是不正确的;他们这样做并嵌入到可执行文件中,并且它必须设置“继承沙箱”才能使子进程正常工作。

一天结束时,每个应用程序一个 xpc 服务是一个阻碍,所以您别无选择,只能找到替代方案。

于 2014-04-14T14:08:57.830 回答