Ubuntu Linux C编程使用dup2实现多管道时grep报错问题求助
问题定位与修复
核心错误点
- 第三段fork生成的wc子进程中,
execvp调用传参错误:你传入了grep对应的参数数组cmd2,而非wc对应的参数数组cmd3。
报错原因说明
execvp的第二个参数是目标进程的完整argv数组,数组第一个元素对应进程的argv[0](也就是程序报错时默认输出的程序名)。当你误传入
cmd2时,wc进程的argv[0]被设置为"grep",argv[1]是"c",wc会尝试把"c"作为输入文件打开,找不到对应文件就会输出带有"grep"前缀的报错,和你遇到的错误提示完全匹配。
修复方法
将第三段子进程中的execvp调用参数修改即可:
// 原错误代码 // if(execvp("wc",cmd2) < 0) // 修复后代码 if(execvp("wc",cmd3) < 0)
额外优化建议
- 可以给
pipe、fork系统调用添加错误判断逻辑,避免系统资源不足时出现未定义行为 - 建议使用
waitpid替代wait,更精准的等待对应子进程退出
内容的提问来源于stack exchange,提问作者Mr Coder
相关产品推荐
相关产品推荐

