与dup2一起使用时,exec()不会终止

时间:2017-04-26 23:11:10

标签: c exec

我正在使用dup2()pipe()fork()来处理带有另一个输入的命令。 ls的输出正确传递到cat,终端显示输出,但不会停止接收输入。换句话说,cat不会终止,所以我可以继续输入。

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
int main() {
   int pipefd[2], child_pid, grand_child;

   pipe(pipefd);

   child_pid = fork();

   if (child_pid) {
      waitpid(child_pid, NULL, 0);
      /* Parent */

      grand_child = fork();

      if (!grand_child) {
         dup2(pipefd[0], STDIN_FILENO);
         close(pipefd[0]);
         close(pipefd[1]);
         execlp("cat", "cat", NULL);
      } else {
         waitpid(grand_child, NULL, 0);
      }

   } else {
      /* Child */

      dup2(pipefd[1], STDOUT_FILENO);

      close(pipefd[1]);
      close(pipefd[0]);


      execlp("ls", "ls", NULL);
   }

   return 0;
}

1 个答案:

答案 0 :(得分:1)

父级仍然打开管道的写入端。 cat正在等待父级关闭它,父级正在等待cat终止。在等待大孩子之前,你应该关闭父母管道的两侧。