gpt4 book ai didi

c - 最后一个 fork 的 child 不会死

转载 作者:IT王子 更新时间:2023-10-29 01:17:28 25 4
gpt4 key购买 nike

我有两次 fork 的主进程,因此创建了两个 child 。两个 child 是这样互相吐槽的:

ls | more

现在的问题是老二永远不死。这是为什么? pipe 里的最后一个 child 什么时候真的死了?

删除一个 wait() 调用显示 ls | 的预期结果更多但给出了一些更奇怪的行为(卡在终端等)。

这是我的代码:

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 标记。两个 child 的 parent 仍然打开管道的两端,所以 more 没有看到 EOF(read() 返回 0),并继续等待获取更多信息。

关于c - 最后一个 fork 的 child 不会死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com