我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

Posted

技术标签:

【中文标题】我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗【英文标题】:Can I open a socket and pass it to another process in Linux 【发布时间】:2011-01-01 03:24:40 【问题描述】:

在 Linux 中,我可以打开一个套接字并将该套接字传递给另一个进程吗? 如果是,您能告诉我在哪里可以找到示例吗?

谢谢。

【问题讨论】:

Can I share a file descriptor to another process on linux or are they local to the process? 的可能重复项 @Gilles'SO-stopbeingevil' 您正在链接到一个在此之后按时间顺序询问的问题,它怎么可能是重复的? 【参考方案1】:

是的,您可以使用 sendmsg() 和 SCM_RIGHTS 从一个进程到另一个进程:

SCM_RIGHTS - 发送或接收一组 从另一个打开文件描述符 过程。数据部分包含一个 文件描述符的整数数组。 传递的文件描述符表现为 尽管它们是用 dup(2).

http://linux.die.net/man/7/unix

但这不是典型的用法。更常见的是当进程从其父进程继承套接字时(在fork() 之后)。子进程可以使用任何未关闭的文件句柄(包括套接字)。所以子进程继承父进程的套接字。

侦听连接的服务器进程称为守护进程。这通常会在每个新连接上分叉,产生一个处理每个新请求的进程。典型守护进程的示例如下:

http://www.steve.org.uk/Reference/Unix/faq_8.html#SEC88

向下滚动到无效process()

【讨论】:

除非您不想为每个请求都派生一个新进程,而只是将请求传递给一组工作人员。 这看起来特定于 AF_UNIX。可以对 TCP 套接字执行此操作吗? @AdrianRatnapala:不,您不能通过 TCP 将套接字(或文件句柄)发送到另一台机器,它们必须位于同一个内核中。所以你通信的通道必须是AF_UNIX,但你传输的文件句柄当然可以是TCP套接字。 @Zarat,好的,很好,你自然不能跨机器发送它们。我不知何故想到只能传输 AF_UNIX 套接字。愚蠢的我 - 手册页实际上非常清楚。 如果两个进程也都从套接字读取会发生什么?

以上是关于我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 AJAX 调用中的成功对象并将其传递给 thymeleaf 进行迭代

创建对象并将其传递给活动失败

有没有办法获取选项标签值并将其传递给车把中的助手?

如何选择来自脚本输出的参数并将其传递给 Bamboo 中的下一个脚本或作业?

如何将活动中的意图传递给已打开的片段

从 Django 中的 JsonResponse 中提取字段值并将其传递给 Ajax Jquery