Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 与子进程共享马赫数端口_Macos_Ipc_Mach - Fatal编程技术网

Macos 与子进程共享马赫数端口

Macos 与子进程共享马赫数端口,macos,ipc,mach,Macos,Ipc,Mach,我正在比较MacOSX上可用的不同IPC机制(管道、套接字、SystemV IPC等),我想看看Mach端口与更高级别的替代方案相比如何。但是,我遇到了一个非常基本的问题:跨进程(特别是跨父进程和子进程)获取端口的发送权限 与文件描述符不同。这意味着必须建立其他转移方式。我能找到的关于这一点的唯一相关页面是,他们在一次更新中声明,他们的方法不再有效,而且永远也不能保证有效,即使这种方法是有效的。(这意味着替换引导端口,现在这样做会破坏XPC。)他们建议的替换使用不推荐的函数,因此这不是一个非常吸

我正在比较MacOSX上可用的不同IPC机制(管道、套接字、SystemV IPC等),我想看看Mach端口与更高级别的替代方案相比如何。但是,我遇到了一个非常基本的问题:跨进程(特别是跨父进程和子进程)获取端口的发送权限

与文件描述符不同。这意味着必须建立其他转移方式。我能找到的关于这一点的唯一相关页面是,他们在一次更新中声明,他们的方法不再有效,而且永远也不能保证有效,即使这种方法是有效的。(这意味着替换引导端口,现在这样做会破坏XPC。)他们建议的替换使用不推荐的函数,因此这不是一个非常吸引人的解决方案

此外,我喜欢旧解决方案的一点是,端口在使用它的进程之间保持相当的私有性。不需要广播端口的存在,就像管道(来自
pipe
调用)在分叉后工作一样。(如果有其他解决方案,我可能会接受,但这有点烦人。)


那么,如何将Mach端口的发送权限从父进程传递给子进程呢?

您可以尝试的一件事(尽管这是一个严重的攻击)是劫持异常端口作为继承机制。在父级中将自定义端口设置为异常端口,分叉子级,让子级从其异常端口获取自定义端口,将其任务端口发送给父级,父级重置其异常端口,重置子级的异常端口,然后两者通过通信通道从此处开始。请参阅
task\u set\u exception\u ports()

bootstrap\u register
已弃用,但
bootstrap\u check\u in
未弃用,可用于注册端口,稍后子进程可使用
bootstrap\u look\u
检索该端口。(不幸的是,这仍然不能提供您想要的隐私)。

推荐的解决方案是根本不直接使用Mach IPC,而是将您的子进程实现为XPC服务,在这种情况下,您可以使用XPC API在幕后使用Mach IPC,但您不必处理任何细节。您有一个用于在父级中发送XPC消息的easy API和一个用于在客户端中接收XPC消息的easy API,还可以轻松地传回回复。系统将为您处理所有的硬部件

如果您不能使用XPC API,请记住,当您使用
bootstrap\u check\u in()
(未弃用)注册您的服务时,它不会是私有的,但如果您在用户空间进程中这样做,它将对您的登录会话是私有的:根进程不会看到它,其他用户的进程也不会看到它。但是,如果您在根进程中执行此操作,它将对所有会话可见

但也请注意,您可以控制谁可以向您发送IPC消息,谁不发送IPC消息。当收到马赫数信息时,您可以请求一个
mach\u msg\u audit\u trailer\t
。这样您就可以访问发送方的
audit\u token\t
。使用
audit\u token\u to\u pid()
可以获得发送方的
pid\t
。正如您所知道的,您可以忽略所有消息(将其传递给
mach\u msg\u destroy()
以避免泄漏资源),除非消息是由您的子进程发送的。因此,您无法避免端口被发现,但可以避免子进程以外的任何进程可能使用此端口

最后但并非最不重要的一点是,您可以给您的端口一个随机名称,毕竟只有您的子进程需要知道它,因此您可以在父进程中动态调用生成一个名称并将其传递给子进程,这样,如果软件扫描端口,就可以看到您的端口,但大多数软件都只使用硬编码名称。

是的,这是对引导端口的一次“体面”的攻击,但我不想对任何其他特殊端口进行攻击。你说的“不安全”是什么意思?关于OP:“我喜欢旧解决方案的一点是,端口在使用它的进程之间仍然是非常私有的。没有必要广播端口的存在”啊,我懂了。。。“私人”和“安全”在几乎每个方面都有不同的含义,所以我不知道你指的是这句话。谢谢你的澄清。