我刚刚了解了管道,我想模仿“|”贝壳提供的噱头。
在下面的代码中,父进程生成2个子进程,之后它们进行管道并被ls和grep替换。当发生这种情况时,父进程会耐心等待。问题是子进程永远不会完成,尽管他们设法通过管道将一些数据发送到屏幕上。
关于SO的管道还有其他帖子,但我从未见过父进程启动2个子进程的设置。我只看到父母与一个孩子交流。
int p0[2];
pipe(p0); //creating pipe
if(fork() == 0) { //child 1
dup2(p0[0], STDIN_FILENO);
close(p0[0]); close(p0[1]);
execlp("grep","grep","a",NULL);
}
else { //parent
if(fork() == 0) { //child 2
dup2(p0[1], STDOUT_FILENO);
close(p0[0]); close(p0[1]);
execlp("ls","ls",NULL);
}
else { //parent
wait(NULL);
wait(NULL); //waiting for c1 and c2
close(p0[0]); close(p0[1]);
printf("parent exit\n");
}
}
我的问题是:孩子为什么不进行处理?叉管结构是健全的还是我完全错了?
答案 0 :(得分:0)
在最后一节开始等待之前关闭管道。