AF_UNIX 套接字:我可以在进程之间传递套接字句柄吗?

Posted

技术标签:

【中文标题】AF_UNIX 套接字:我可以在进程之间传递套接字句柄吗?【英文标题】:AF_UNIX socket: can I pass socket handle between processes? 【发布时间】:2009-11-05 20:10:33 【问题描述】:

假设我创建了一个 socketpair() 并将其中一个套接字的 句柄 传递给一个衍生进程 (popen),该进程能否与父进程通信?

我看到的示例是使用 fork() 应用的,这超出了我当前项目的范围。

更新:我尝试了一个简单的测试:

    客户端:socketpair 带套接字[0]

    从客户端使用posix_spawn 和sockets1 作为命令行参数

    客户端:write 到套接字...客户端退出而没有任何警告...

看来这个方法有问题。

更新:我还发现了这个note:

Pipes and socketpairs are limited to communication between processes with a common ancestor.

【问题讨论】:

@Jim:还没有……我希望这个问题能快速得到解决…… 关于“客户端在没有任何警告的情况下退出”,perror(3)没有说什么吗? @Inshallah:当我调用write 时,进程退出,所以我不能perror() @jldupont - 我不认为你的意思是客户,从字面上看,只是退出:-)。某些信号处理程序可能负责终止您的进程。尝试捕获 SIGPIPE(或其他一些,请参阅 signal(7))。此外,请确保您正在检查所有返回值是否存在错误。如果您可以发布用于测试的代码,那最好。 【参考方案1】:

execve 的手册页说明:

 File descriptors open in the calling process image remain open in the new
 process image, except for those for which the close-on-exec flag is set
 (see close(2) and fcntl(2)).  Descriptors that remain open are unaffected
 by execve().

由于像 popen 这样的函数是基于 execve 的,那么您从 socketpair 函数获得的文件描述符应该在两个进程中都很好,我不明白为什么您不能以任何让您满意的方式传递描述符。我假设在这种情况下,您的意思是将其转换为字符串并通过 STDIN 将其设置为子进程,这会将其转换回 int 以用作文件描述符。

当然值得为它编写一些试用代码。

【讨论】:

popen 不会关闭现有的文件描述符,除了:“popen() 函数应确保来自先前 popen() 的任何流在父进程中保持打开的调用在新的子进程中关闭。” opengroup.org/onlinepubs/009695399/functions/popen.html 澄清一下,请注意子节点被分叉后打开的文件描述符(并将字符串化发送到子节点的STDIN)将不会在子节点中打开。只有在调用 execve 时已经打开的 fds 也会在子进程中打开,并且通常这些 fds 将通过命令行参数传递给子进程。我认为没有理由涉及管道。【参考方案2】:

是的,您可以将其传递给子进程。诀窍实际上是 socketpair() 为您提供了一对连接的套接字 - 确保孩子保留一个,父母保留另一个(父母应该关闭孩子,反之亦然)。

但大多数情况下使用一对管道。

【讨论】:

查看有问题的更新部分。我这样做无济于事。我通过posix_spawn创建了子进程:这可能是问题吗?

以上是关于AF_UNIX 套接字:我可以在进程之间传递套接字句柄吗?的主要内容,如果未能解决你的问题,请参考以下文章

进程之间的套接字传递

AF_UNIX 套接字路径中“\0hidden”的目的是啥?

Linux-进程间通信: 域套接字

python 使用Python的多处理库在进程之间传递套接字的示例

可以在Unix域套接字上使用SO_REUSEPORT吗?

在不相关的进程之间复制 Windows 套接字