我的主进程分叉了两次,从而创建了两个子进程。这两个孩子是这样相互沟通的:
ls | more
现在的问题是,第二个孩子永远不会死。这是为什么?管道中的最后一个孩子什么时候真正死亡?
删除一个wait()调用显示了预期结果ls | more
但给出了一些进一步奇怪的行为(卡住终端等)。
这是我的代码:
int main(){
printf("[%d] main\n", getpid());
int pip[2], i;
pipe(pip);
/* CHILDREN*/
for (i=0; i<2; i++){
if (fork()==0){
/* First child */
if (i==0){
printf("[%d] child1\n", getpid());
close(1); dup(pip[1]);
close(pip[0]);
execlp("ls", "ls", NULL);}
/* Second child */
if (i==1){
printf("[%d] child2\n", getpid());
close(0); dup(pip[0]);
close(pip[1]);
execlp("more", "more", NULL);}
}
}
wait(NULL); // wait for first child
wait(NULL); // wait for second child
return 0;
}
在所有用户关闭写入端之前,管道的读取端不会获得 EOF 标记。两个孩子的父母仍然有管道的两端开放,所以more
没有看到 EOF(从返回 0read()
),并继续等待更多输入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)