You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义UNIX Shell实现多管道功能时dup2调用失败问题求助

多管道Shell实现代码逻辑错误说明

你代码中存在3个核心逻辑错误,直接导致了测试用例触发写失败报错:

  • 错误1:管道初始化循环逻辑异常
    你定义了numOfPipes个管道,每个管道仅需调用1次pipe()初始化,占用2个连续的文件描述符位。原代码循环次数写为2倍管道总数,会直接导致fds数组越界写入,破坏已初始化的管道文件描述符取值。
    原错误代码:

    for (i = 0; i < 2 * numOfPipes; i++)
    {
        if (pipe(fds + 2 * i) == -1)
        {
            printf("Failed to create file descriptors for pipe commands!\n");
            exit(EXIT_FAILURE);
        }
    }
    

    修正后代码:

    for (i = 0; i < numOfPipes; i++)
    {
        if (pipe(fds + 2 * i) == -1)
        {
            printf("Failed to create file descriptors for pipe commands!\n");
            exit(EXIT_FAILURE);
        }
    }
    
  • 错误2:非末尾命令判断条件错误
    管道总命令数为numOfPipes + 1,索引范围是0 ~ numOfPipes,仅当索引不等于numOfPipes时才需要重定向标准输出到下游管道。原代码判断条件写为i != numOfPipes+1,该条件永远成立,会导致最后一个命令尝试重定向输出到不存在的非法管道写端,直接触发你遇到的写失败报错。
    原错误代码:

    if (i != numOfPipes+1 && commands[i + 1] != NULL)
    

    修正后代码:

    if (i != numOfPipes)
    
  • 错误3:execvp调用参数错误
    execvp第一个参数需要传入可执行程序名,你传入了未拆分的完整命令串commands[i](例如echo tst),系统无法识别该路径。正确应该传入拆分后的参数数组首位args[0]。
    原错误代码:

    if (execvp(commands[i], args) < 0)
    

    修正后代码:

    if (execvp(args[0], args) < 0)
    

另外补充一个优化点:子进程中execvp调用失败后,应该调用exit(EXIT_FAILURE)终止子进程,不要用return,避免子进程继续执行后续不属于它的逻辑。

内容的提问来源于stack exchange,提问作者Stelios Papamichail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:45:04