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

