如何通过PIPE/FORK将父进程STDIN数据传递到曾孙进程
解决方案
你可以通过以下两种可行方案实现用户输入到Process C的透传:
方案1:新增独立专用管道(推荐,逻辑清晰无耦合)
核心思路
新增一组独立管道专门传输定向到Process C的用户输入,在Parent层先做输入分流,再将管道读端沿着进程链一路传递到Process C。
实现步骤
- Parent层新增管道与分流逻辑
首先在父进程中新增一对管道c_pipe,同时约定用户输入的分流规则,比如!c前缀的输入为发给Process C的命令,其余输入走原有解析逻辑发给Process A。
修改后的父进程代码如下:
// parent process int c_pipe[2]; pipe(c_pipe); // 初始化C专用管道 Parser P; while (!std::cin.eof()) { std::string line; std::getline(std::cin, line); // 分流:识别发给C的命令 if (line.rfind("!c ", 0) == 0) { std::string c_cmd = line.substr(3) + "\n"; write(c_pipe[1], c_cmd.c_str(), c_cmd.size()); continue; } // 原有逻辑保持不变 arguments = P.BeginParsing(line); if (arguments.size() > 0) { for (int k = 0; k < 4; k++) { finalArguments[k] = arguments[k]; } close(fd[0]); write(fd[1],finalArguments,4*sizeof(int)); close(fd[1]); } }
- 打通管道继承链路
- Parent fork Process A时,将
c_pipe[0](管道读端)作为参数传给Process A的C++程序,c_pipe[1]在父进程退出前关闭即可 - Process A fork Process B时,将该读端fd传递给Python脚本
- Process B fork Process C时,将读端fd传递给C程序,或根据需求
dup2到C的指定文件描述符
- Process C适配
如果Process C需要同时读取Process B的业务输出和用户输入,用select/epoll同时监听两个输入fd即可;如果仅需要额外接收用户控制命令,直接读取传入的管道读端即可。
方案2:原有链路内嵌标识传输(无需新增管道)
核心思路
无需新增管道,在Parent层将给C的输入封装为特殊格式的参数发给Process A,Process A输出到stdout时打上特殊标记,Process B识别到标记后直接将内容写入Process C的stdin,其余业务数据照常传输。
注意事项
- 需要统一各进程的传输协议规则,避免业务数据和控制命令冲突
- 适合Process C不需要区分输入来源的场景
通用注意事项
- 管道的文件描述符在不需要使用的进程中要及时关闭,避免出现EOF无法正常触发的问题
- 跨exec传递fd时,不要给对应fd设置
FD_CLOEXEC标识,否则exec后fd会被自动回收 - 如果需要区分输入来源,可在传输内容前增加1-2字节的类型头,0代表业务数据,1代表用户输入命令。
内容的提问来源于stack exchange,提问作者Osama Naeem
相关产品推荐
相关产品推荐

