C语言dup2重定向STDOUT失效:ls输出未写入目标文件
问题分析与修复方案
核心问题
你遇到的问题并非dup2使用错误,而是重定向参数处理逻辑出错,导致最终执行的命令变成了ls junk.txt,而非预期的ls,因此文件中只写入了junk.txt字符串。
具体错误点及修复
1. 重定向符与目标参数未被跳过
遍历argv时,遇到">"后仅记录了目标文件,但未跳过">"和后续的目标参数,导致junk.txt被错误加入argvSec数组。修改循环逻辑:
char* redirect_arg = NULL; int i2 = 0; // 初始化i2 for (int i = 0; argv[i] != NULL; i++) { if (strcmp(argv[i], ">") == 0) { redirect_arg = argv[i + 1]; i++; // 跳过目标文件参数,避免加入argvSec continue; // 跳过当前重定向符的处理 } else { argvSec[i2] = argv[i]; i2++; } } argvSec[i2] = NULL;
2. 变量未初始化
代码中i和i2未初始化,默认是随机值,会导致数组越界或错误赋值。在使用前必须初始化:
int i = 0; // 初始化i token = strtok(command, " "); while (token != NULL) { argv[i] = token; token = strtok(NULL, " "); i++; } argv[i] = NULL;
3. fork失败分支未终止
case -1后没有break,会导致fork失败后继续执行子进程代码,引发错误:
case -1: last_exit_status = 1; break; // 添加break终止该分支 case 0: // 子进程逻辑...
4. 可选:添加dup2错误检查
虽然dup2调用逻辑正确,但建议添加错误检查便于调试:
if (dup2(fd_out, STDOUT_FILENO) == -1) { perror("dup2 failed"); exit(1); }
修复后效果
修复后,argvSec会正确仅包含["ls", NULL],执行execvp(argvSec[0], argvSec)时会调用ls,其输出会通过dup2重定向到junk.txt,符合预期。
内容的提问来源于stack exchange,提问作者Ahmed Zaidan
相关产品推荐
相关产品推荐

