C管道重定向问题

时间:2016-02-23 17:42:32

标签: c shell unix

所以我在这里查看了一些与我的问题相关的答案,并使用了一些代码(主要来自这个答案: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),可以正常工作。

我很难过,请帮忙!

谢谢,

亚历。

0 个答案:

没有答案