所以我在这里查看了一些与我的问题相关的答案,并使用了一些代码(主要来自这个答案:https://stackoverflow.com/a/11518304/1852119)然而,我似乎无法弄清楚如何让我的程序按预期工作。
预期输出:
$> ls> ls.txt |猫
ls.txt应填充“ls”的输出,shell应显示cat的输出(cat的输入为ls)
实际输出:
$> ls> ls.txt |猫
它正确地显示cat的输出(cat输入为“ls”),但是当我检查ls.txt文件时,它不存在(从未创建过)。
这是我的代码:
int redirect(int redirect_type, int prev_stdin, char ** argv, char * filename) {
int returnfd;
int status;
fflush(0);
pid = fork();
if(pid < 0) err_sys("Error creating child process.");
if(pid == 0) {
if(redirect_type == REDIRECT_STDOUT) {
int fd0 = creat(filename, 0644);
dup2(prev_stdin, STDIN_FILENO);
dup2(fd0, STDOUT_FILENO);
close(fd0);
} else {
int fd1 = open(filename, O_RDONLY);
dup2(fd1, STDIN_FILENO);
close(fd1);
}
if(execvp(argv[0], argv) == -1) err_sys("Error executing command ");
}
returnfd = open(filename, O_RDONLY);
waitpid(pid, &status, 0);
return returnfd;
}
prev_stdin是上一个命令运行的输出,它通过创建文件,将文件的fd作为stdout_fileno,运行命令并关闭文件来工作。然后它创建一个新的文件描述符,打开刚刚创建的文件,并将其作为下一个命令的prev_stdin返回。
下一个命令接收正确的输入,这意味着必须创建文件(因此它可以作为返回值再次打开),所以它让我认为这是一个文件关闭问题,但是我关闭了已存在于子进程中的文件只运行一个命令(例如$ ls&gt; ls.txt),可以正常工作。
我很难过,请帮忙!
谢谢,
亚历。