【问题标题】:Sharing Mach ports with child processes与子进程共享 Mach 端口
【发布时间】:2013-03-21 08:05:00
【问题描述】:

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

与文件描述符不同,ports are generally not carried over to forked processes。这意味着必须建立一些其他的传输方式。我能找到的唯一相关页面是this one,他们在更新中声明他们的方法不再有效并且永远不能保证,即使该方法是suggested by an Apple engineer in 2009。 (这意味着替换引导端口,现在这样做会破坏 XPC。)他们建议的替换使用不推荐使用的函数,所以这不是一个非常吸引人的解决方案。

此外,我喜欢旧解决方案的一件事是,端口在使用它的进程之间仍然非常私密。不需要广播端口的存在,就像管道(来自pipe 调用)一旦分叉就可以工作。 (如果有其他解决方案,我可能会接受它,但这有点烦人。)

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

【问题讨论】:

    标签: macos ipc mach


    【解决方案1】:

    bootstrap_register 已被弃用,但bootstrap_check_in 不是,可用于注册您的端口,稍后可以使用bootstrap_look_up 由子进程检索该端口。 (不幸的是,这仍然不能提供您正在寻找的隐私)。

    【讨论】:

    • “不安全”是什么意思?
    • 关于 OP:“我喜欢旧解决方案的一件事是端口在使用它的进程之间仍然非常私密。没有必要广播端口的存在”跨度>
    • 啊,我明白了……好吧,“私人”和“安全”在几乎每个方面都有完全不同的含义,所以我不明白您指的是这个声明。感谢您的澄清。
    【解决方案2】:

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

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

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

    另外请注意,您可以控制谁可以向您发送 IPC 消息,谁不可以。您可以在收到 mach 消息时请求mach_msg_audit_trailer_t。这样您就可以访问发件人的audit_token_t。并且使用audit_token_to_pid() 可以获得发件人的pid_t。正如您知道孩子的 PID,您可以简单地忽略所有消息(将其传递给 mach_msg_destroy() 以避免资源泄漏),除非消息是由您的子进程发送的。所以你不能避免你的端口是可发现的,但你可以避免除你的子进程之外的任何进程都可以使用这个端口。

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

    【讨论】:

      【解决方案3】:

      您可能会尝试的一件事(尽管它是一种严重的黑客攻击)是劫持异常端口作为继承机制。将自定义端口设置为父级的异常端口,派生子级,让子级从其异常端口获取自定义端口,将其任务端口发送给父级,父级重置其异常端口,重置子级的异常端口,然后然后两人从那里通过通信渠道继续前进。见task_set_exception_ports()

      【讨论】:

      • 是的,这是对引导端口的“体面”破解,但我宁愿不使用任何其他特殊端口。
      猜你喜欢
      • 2019-06-23
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2015-11-17
      • 1970-01-01
      相关资源
      最近更新 更多