C - 子进程挂起在管道内



当我用ls | head执行这个函数时,它在打印出文件和目录后挂在第二个子进程中。有人可以告诉我我在这里错过了什么吗?提前致谢

int unipipe(char* lhs[], char* rhs[])
{
    int pfd[2];
    int status, cid;
    pid_t pid;
    char buf;
    if((lhs != NULL) && (rhs != NULL))
    {
      if(pipe(pfd) != 0)
      {
        perror("pipe");
        return -1;
      }
    if((pid = fork()) < 0)
    {
        perror("fork");
        return -1;  
    }
    else if(pid == 0)
   {
       close(1); //close the unused read end
      dup2(pfd[1], STDOUT_FILENO);
      //execute the left-hand side command
      close(pfd[0]);
      execvp(lhs[0], lhs);
       _exit(EXIT_SUCCESS);
    }
   if(setpgid(pid, 0) < 0)
   {
     perror("setpgid"); 
     return -1;
   };
  cid = waitpid(pid, &status, 0);
  if((pid = fork()) == 0)
    {
        close(0);
        dup2(pfd[0], STDIN_FILENO);
        close(pfd[1]);  //close the unused write end
        execvp(rhs[0], rhs);
        _exit(EXIT_SUCCESS);
    } 
    else
    {
           waitpid(pid, &status, 0);
    }
}

在启动第二个进程之前,请等待第一个进程退出。每个管道都有一个缓冲区,一旦这个缓冲区已满,I/O 函数就会阻塞,等待从管道读取几个字节,以便更多字节可以"流入"。您的第一个进程很可能阻塞在管道上,因此永远不会退出。

我会声明两个类型 pid_t 的变量,每个子变量一个,并且只有在两个变量都成功启动后才等待它们。

要使程序运行,请删除第一个:

cid = waitpid(pid, &status, 0);

在:

else
{
       waitpid(pid, &status, 0);
}

将其替换为:

wait(); // for the fist child
wait(); // for the second child

您的程序将正在运行。

最新更新