在不同进程之间传递文件描述符的可移植方式

Posted

技术标签:

【中文标题】在不同进程之间传递文件描述符的可移植方式【英文标题】:Portable way to pass file descriptor between different processes 【发布时间】:2010-10-28 21:17:14 【问题描述】:

在大多数 UNIX 系统上,通过 fork() 可以轻松地为子/父进程在进程之间传递打开的文件;但是我需要在孩子已经分叉之后分享一个 fd。

我发现一些 webpages 告诉我 sendmsg() 可能适用于任意进程;但这似乎非常依赖于操作系统并且很复杂。 portlisten 似乎是我能找到的最好的例子,但我更喜欢像 libevent 这样的好的包装库,它隐藏了 kqueue、pool 等所有魔力。

有谁知道是否有一些库(和可移植的方式)可以做到这一点?

【问题讨论】:

在Demystifying Unix Domain Sockets上搜索“文件描述符传递” 【参考方案1】:

最好的办法是尝试通过 Unix 域套接字发送文件描述符。这在 Stephens 和网络上的一些地方都有描述,但如果你问得好,我可以为你挖掘代码。

如今这将非常便携;许多被认为是“不可移植”的东西(例如mmap!)现在非常普遍。如果您需要比“当今大多数系统”更便携,那么您将面临很多有趣的问题,但如果您告诉我们更多关于您正在做什么以及您正在使用的平台的信息(也许是非 Unix POSIX 平台?)我们也许可以提供帮助。

【讨论】:

我在使用 sendmsg() 时仍有疑问。我认为将域套接字作为第一个参数就足够了,但似乎我仍然必须将 msghdr.msg_name 填充为域套接字的 sockaddr_un - 为什么?无论如何要防止它?【参考方案2】:

有一个基于 Unix 域套接字的机制用于在进程之间传输文件描述符(例如套接字 - 当然不能进行内存映射) - 使用 sendmsg() 系统调用。

您可以在Stevens(Curt Sampson 提到)以及Wikipedia 中找到更多信息。

您可以在Sending file descriptor by Linux socket 找到一个关于工作代码的更新的问题。

【讨论】:

以上是关于在不同进程之间传递文件描述符的可移植方式的主要内容,如果未能解决你的问题,请参考以下文章

在进程间传递文件描述符

传送文件描述符的简单示例

Nebula系列通过UNIX域套接字传递描述符的应用

寻找有关如何使用 socket.io 或 IPC 传递文件描述符的示例

文件I/O

监控文件描述符的六种方式(进程监控selectpoll非阻塞轮询I/O异步I/O线程监控)