我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]);
}
}