自定义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
相关产品推荐
相关产品推荐

