与子进程共享端口马赫(Sharing Mach ports with child processes

2019-08-18 08:46发布

我做的Mac OS X上使用不同的IPC机制的比较(管道,插座,系统V IPC等),我想看看端口如何马赫比较高层次的替代品。 不过,我碰到的一个很基本的问题:越来越跨进程发送权限港口(特别是跨父进程和子进程)。

不像文件描述符, 端口一般不结转到派生进程 。 这意味着,将他们转移一些其他的方式必须建立。 只是唯一相关的页面,我可以找到,这是这一个 ,他们在他们的方法不再起作用更新状态,从来没有被保证,即使是该方法由Apple工程师在2009年提出 。 (这意味着更换引导端口,现在这样做,休息XPC。)更换他们建议弃用功能用途,所以这不是一个非常有吸引力的解决方案。

此外,有一件事我喜欢对旧的解决方案是,港口仍然非常私人所使用它的过程之间。 没有必要广播端口的存在,就像管道(从pipe调用)工作,一旦分叉。 (我可能会接受它,如果有另一种解决方案,但它是一个有点讨厌。)

那么,你如何从父进程传递一个发送权利马赫端口,一个子进程?

Answer 1:

bootstrap_register已被弃用,但bootstrap_check_in不是,可用于注册其可之后的子进程通过检索您的端口bootstrap_look_up 。 (这仍然不能提供你正在寻找的隐私,可惜)。



Answer 2:

推荐的解决方案是不使用马赫IPC直接所有,但实现你的孩子的过程作为一个XPC服务,在这种情况下,你可以使用将使用马赫IPC幕后的XPC API,但你不必应付任何细节。 你有一个简单的API在父母和一个简单的API客户端接收邮件XPC XPC发送邮件,也可以很容易地传回的答复。 该系统将处理所有的硬部件为您服务。

https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html

如果您无法使用XPC API,请记住,当你注册你的服务bootstrap_check_in()不推荐),它不会是私人的,但如果你在一个用户空间程序这样做,这将是私人你的登录会话:根进程不会看到它,其他用户都不过程。 如果你这样做,在一个根过程,这将是所有的会话可见,虽然。

但还要注意,你可以控制谁可以发送您IPC消息,谁不是。 您可以要求mach_msg_audit_trailer_t接收马赫消息时。 这样,你得到访问audit_token_t发件人。 并使用audit_token_to_pid()就可以得到pid_t发件人。 你知道你的孩子的PID,你可以简单地忽略所有消息(把它传递给mach_msg_destroy()以避免泄漏资源),除非该消息是由你的孩子进程发送。 所以你不能避免你的端口被发现,可以,但你可以避免比你的子进程之外的任何进程可能会使用此端口。

而在去年没有但并非最不重要,你可以给你的端口随机名称,毕竟只有你的子进程需要知道它,所以你可以dynamicall生成父进程的名称和把它传递给你的孩子的过程中,这样,如果软件扫描的端口,但大多数软件只使用硬编码的名称反正你的端口就可以看出。



Answer 3:

有一两件事你可以尝试(尽管这是一个总的黑客)被劫持的异常端口作为继承机制。 设置自定义端口父的异常端口,叉孩子,有孩子得到它的异常端口的自定义端口,发送它的任务端口父,父重置其异常端口,重置孩子的异常端口,并然后将两个从那里继续进行的通信信道。 见task_set_exception_ports()



文章来源: Sharing Mach ports with child processes
标签: macos ipc mach