为多个 forks() 创建 socketpairs() 或者一个就足够了

Posted

技术标签:

【中文标题】为多个 forks() 创建 socketpairs() 或者一个就足够了【英文标题】:create socketpairs() for multiple forks() or just one is enough 【发布时间】:2022-01-12 04:33:06 【问题描述】:

我正在尝试制作一个执行以下操作的程序:

./run cmd1 arg1 : cmd2 arg2 : cmd3 arg3

允许我使用 fork()execvp 并行运行三个命令,并仅使用 socketpair 将 cmd 1 的输出连接到 cmd 2 的输入。

我的问题是:

我是否需要为我使用的每个命令创建多个套接字对,或者我可以使用相同的套接字对,我只是一次又一次地使用它?

谢谢

【问题讨论】:

【参考方案1】:

您应该为需要使用的每个父子通信链接创建一个单独的套接字对。

例如,您的程序可能具有如下结构:

Process #1 creates socketpair(A,B)
Process #1 calls fork(), creating Process #2
Process #1 uses socket A to communicate with Process #2
Process #2 uses socket B to communicate with Process #1
Process #2 creates socketpair(C,D)
Process #2 calls fork(), creating Process #3
Process #2 uses socket C to communicate with Process #3
Process #3 uses socket D to communicate with Process #2

请注意,在上面的示例中,进程#2 不能重用套接字 B 与进程#3 通信,因为它需要套接字 B 与进程#1 通信。进程 #2 不能将套接字 A 用于任何事情,因为套接字 A 保留给进程 #1 使用(如果进程 #2 尝试使用它的套接字 A,进程 #2 只会在套接字 B 上向自身发送字节,这不是一件有用的事情)

【讨论】:

以上是关于为多个 forks() 创建 socketpairs() 或者一个就足够了的主要内容,如果未能解决你的问题,请参考以下文章

高级IO中socketpair实现进程间通信以及重定向

socketpair函数详解

socketpair和pipe的区别

Ansible 学习总结(11)—— task 并行执行之 forks 与 serial 参数详解

Ansible 学习总结(11)—— task 并行执行之 forks 与 serial 参数详解

高级I/O-----socketpair