多fork实现多命令并行管道需创建多个socketpair还是单个即可
问题解答
你必须为每一对相邻的通信命令创建独立的socketpair,不可复用同一个socketpair,原因如下:
- 避免数据流串扰:单个
socketpair只能承载一路单向的数据流,如果复用同一个套接字对,前序命令的输出、后序命令的输出会混在同一个缓冲区里,下游命令读取到的数据会完全乱序,无法实现类似Shell管道的cmd1输出→cmd2输入、cmd2输出→cmd3输入的链式传递逻辑。 - 适配并行运行特性:你所有命令是通过
fork()并行启动的,多个进程同时读写同一个socketpair的话,数据会出现随机交错,根本无法保证上下游之间的数据传递顺序。 - 支持正常的EOF触发逻辑:链式管道的正常运行依赖于无关进程及时关闭不需要的套接字文件描述符,只有这样当前序命令退出时,下游命令才能收到EOF信号结束读取。如果复用同一个
socketpair,你无法针对性关闭不同链路的文件描述符,会导致下游命令永远等不到EOF,最终挂起。
以你给出的cmd1 : cmd2 : cmd3三个命令的场景为例,你只需要创建2组独立的socketpair即可:
- 第一组
socketpair对接cmd1和cmd2:将cmd1的标准输出重定向到该套接字对的写端,cmd2的标准输入重定向到该套接字对的读端 - 第二组
socketpair对接cmd2和cmd3:将cmd2的标准输出重定向到该套接字对的写端,cmd3的标准输入重定向到该套接字对的读端
每组socketpair创建后,所有子进程只需要保留自身用到的1-2个文件描述符,其余无关的套接字描述符必须全部关闭,否则会出现EOF无法正常触发的问题。
内容的提问来源于stack exchange,提问作者asmazizou
相关产品推荐
相关产品推荐

