我正在尝试将Wine 1.7.13移植到现代可可中。我正在考虑在XPC服务的进程中运行Windows二进制文件,以实现安全隔离和防崩溃。但是,存在一个问题:就我所知,XPC服务是单例的。一次只能运行一个XPC服务进程。这是因为,如果我使用线程使多个Windows可执行文件同时运行,在段错误或其他硬崩溃的问题一个的Windows二进制文件会导致所有其他的二进制文件与它崩溃。
如前所述在这里,人们普遍理解的是,上面的表述是真实的。如果是这样,我似乎无法在单个XPC服务过程中实现这种隔离。
我的另一种选择是使用沙箱继承(具有GUI应用程序分支,并使用更传统的IPC来使Windows进程彼此通信),而不是XPC服务。使用该服务代替XPC服务的利弊是什么?我了解,继承其父公司的沙箱的进程将没有自己的权利。还有哪些其他缺点?
我也知道Apple不鼓励使用沙箱继承来支持XPC,但这仍然是一个可行的设计决策。他们一定有保留它的理由。沙盒Mac App Store应用程序能够以这种方式使用沙盒继承吗?
我正在做出同样的决定。我一心想要XPC服务,但是当发现有一个XPC服务有多个连接时,我无法使用它们(我的XPC服务将使用第三方提供的插件,所以我想将它们分开,而且 XPC 服务将使用可能无法正确清理的库,因此我希望能够在保持 UI 稳定的同时处理它们 - 好吧,我不必证明这一点 - 我想要每个进程一个进程 -工作就是这样)。
我正在考虑使用CocoaAsyncSocket进行通信 posix_spawn()(我认为fork()这比WRT 到沙箱的表现更好)的正常子进程模型。我将看看是否可以用 UNIX 套接字替换 CocoaAsynSocket 中 TCP/IP 的使用来加速通信(如果可行的话,我的目的是把它贡献给项目)。(更新:这已经由 github 用户 @jdiehl 完成了。请参阅他的分支以及上游存储库的第 88 期问题中的讨论)。socketUN
对于数据编组,我将使用Google Protocol Buffers(更新#2:不;不值得麻烦,NSKeyedArchiver并NSKeyedUnarchiver提供开箱即用所需的一切。它们可能不会提供像 Google Protocol Buffers 那样打包的数据,但它们 1)不'不需要编写和维护,2)通过实现NSCoding协议允许任何类参与,3)不必解决跨平台数据交换的问题。
我能看到的唯一可能的缺点是我不知道文件书签是否可以传递给子进程并使用(即UI打开一个文件或将一个文件拖到其中并希望向工作进程提供对该文件的访问权限) )。我会用我学到的一切来更新这个答案。(最终更新:通过 UNIX 域套接字传递 URL 书签工作正常,并且书签甚至不需要是安全范围的书签即可工作。XPC 的替代方案不再有任何障碍)。
您关于子流程没有自己的权利的断言是不正确的;它们确实如此并且嵌入到可执行文件中,并且它必须设置“继承沙箱”才能使子进程正常工作。
最终,每个应用程序一个 xpc 服务是一个阻碍,因此您别无选择,只能寻找替代方案。
| 归档时间: |
|
| 查看次数: |
1315 次 |
| 最近记录: |