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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:16:28