在C ++中通过管道从子进程读取stderr时挂起父级

时间:2016-07-28 23:01:06

标签: c++ linux pipe fork stderr

fork一个子进程,它反过来产生一个孙子进程并返回。如果产生该子孙有任何错误,则该孩子使用stderr语句写入fprintf并退出。

我正在尝试从父级的子进程中读取stderr。但是,父进程从子进程读取while循环。当我查看ps -ef时,孩子是<defunct>

以下是我为完成此操作而编写的代码。我是新手,网上搜索没有提供足够的信息,说明当孩子

时父母被挂起的原因
int pipe_out[2];
// Create the pipe
if (pipe(pipe_out) < 0) {
  perror("Failed pipe");
  exit(1);
}

// Create the child process
int status;
pid_t pid = fork();
switch(pid) {
  case -1:  
    perror("Failed fork");
    exit(1);
  case 0: { // Child
    close(pipe_out[0]);  // close read end

    // Make stderr go to pipe write end
    dup2(pipe_out[1], STDERR_FILENO); 
    close(pipe_out[1]);

    // start my process 
    execvp(inp_args[0], inp_args);
    _exit(EXIT_FAILURE);
    break;
  }    
  default: { // Parent
    close(pipe_out[1]); // close write end

    // read from child
    while( read(pipe_out[0], buffer, sizeof(buffer)) )
      log(stdout, "%s\n",buffer);
    }    

    // wait for end then close other end of pipe
    waitpid(pid, &status, 0);

    if (WIFSIGNALED(status))
      log(stdout, "killed by signal %d\n", WTERMSIG(status));

    close(pipe_out[0]);
  }    
}

0 个答案:

没有答案