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

Shell管道命令复现项目:输入输出文件管理问题求助

解决pipex输入/输出文件的处理问题

1. 输入文件(argv[1])的处理(第一个子进程)

第一个命令需要从argv[1]指定的文件读取输入,替代默认标准输入。在第一个子进程中执行以下操作:

  • 用open()以只读模式打开输入文件,模式参数设为O_RDONLY
  • 通过dup2()将打开得到的文件描述符重定向到STDIN_FILENO
  • 关闭原文件描述符(dup2已完成复制,无需保留)
  • 处理open()失败的情况(比如文件不存在、权限不足)

修改第一个子进程代码:

if (pid1 == 0) // First child
{
    int in_fd = open(argv[1], O_RDONLY);
    if (in_fd == -1)
    {
        perror("open infile");
        exit(EXIT_FAILURE);
    }
    dup2(in_fd, STDIN_FILENO);
    close(in_fd);
    
    dup2(fd[1], STDOUT_FILENO);
    close(fd[0]);
    close(fd[1]);
    
    if (path_ultime1 == NULL)
    {
        perror(cmd_and_options1[0]);
        exit(EXIT_FAILURE);
    }
    execve(path_ultime1, cmd_and_options1, envp);
    perror("execve"); // 走到这里说明execve执行失败
    exit(EXIT_FAILURE);
}

2. 输出文件(argv[4])的处理(第二个子进程)

第二个命令需要将输出写入argv[4]指定的文件,替代默认标准输出。在第二个子进程中执行以下操作:

  • 用open()打开输出文件,模式参数设为O_WRONLY | O_CREAT | O_TRUNC(只写模式,文件不存在则创建,存在则清空内容)
  • 设置文件权限为0644(用户可读写,组和其他用户可读,符合常规文件权限)
  • 通过dup2()将打开得到的文件描述符重定向到STDOUT_FILENO
  • 关闭原文件描述符
  • 处理open()失败的情况

修改第二个子进程代码:

if (pid2 == 0) // Second child
{
    int out_fd = open(argv[4], O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (out_fd == -1)
    {
        perror("open outfile");
        exit(EXIT_FAILURE);
    }
    dup2(out_fd, STDOUT_FILENO);
    close(out_fd);
    
    dup2(fd[0], STDIN_FILENO);
    close(fd[0]);
    close(fd[1]);
    
    if (path_ultime2 == NULL)
    {
        perror(cmd_and_options2[0]);
        exit(EXIT_FAILURE);
    }
    execve(path_ultime2, cmd_and_options2, envp);
    perror("execve");
    exit(EXIT_FAILURE);
}

额外必要修改

  • 检查参数数量:当前代码忽略了argc,必须先判断参数是否为5个,避免越界访问argv:
int main(int argc, char *argv[], char **envp)
{
    if (argc != 5)
    {
        fprintf(stderr, "Usage: %s infile \"cmd1\" \"cmd2\" outfile\n", argv[0]);
        return EXIT_FAILURE;
    }
    // 原有代码...
}
  • 内存泄漏修复:ft_split返回的cmd_and_options1/cmd_and_options2,以及find_path返回的path_ultime1/path_ultime2,需要在父进程中调用free释放,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:45:48