为多个 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() 或者一个就足够了的主要内容,如果未能解决你的问题,请参考以下文章
Ansible 学习总结(11)—— task 并行执行之 forks 与 serial 参数详解