C 当fork在一个循环中时,为什么不是一个平衡树呢?
考虑以下代码C 当fork在一个循环中时,为什么不是一个平衡树呢?,c,ubuntu,fork,C,Ubuntu,Fork,考虑以下代码 for(i=1;i<=4;i++) { int pid=fork(); if(pid==0) { printf("\nI am child %d\n",i) } else { wait(); printf("\n I am parent %d\n",i) } } 输出 我是一个孩子 我是孩子2 我是三岁小孩 我是父母3
for(i=1;i<=4;i++)
{
int pid=fork();
if(pid==0)
{
printf("\nI am child %d\n",i)
}
else
{
wait();
printf("\n I am parent %d\n",i)
}
}
输出
我是一个孩子
我是孩子2
我是三岁小孩
我是父母3
我是父母2
我是三岁小孩
我是父母3
我是家长1
我是孩子2
我是三岁小孩
我是父母3
我是父母2
我是三岁小孩
我是父母3
所以我的观察结果是,输出总是一个平衡树,有2^4-2个输出,使用下面的观察结果,这总是一个平衡树
首先父分叉创建子分叉,然后子分叉创建子分叉,这样子分叉创建它的子分叉,直到没有循环终止。
然后在非常深的地方,孩子打印我,然后是兄弟姐妹的父母,我们向上打印每个兄弟姐妹的父母
我的观察正确吗
代码变更
输出
i的值为1
i的值是2
i的值是3
naseer@naseer-汗:~$
i的值是3
i的值是2
i的值是3
i的值为1
i的值是2
i的值是3
i的值是3
i的值是3
i的值是2
i的值是3
i的值是3
naseer@naseer-汗:~$
有人能解释一下现在发生了什么,甚至在某些迭代中会显示命令提示符吗?但是我在父级中使用了wait。但是您的父级printf在wait之前请同时更新您的输出。现在应该不一样了。@PSkocik当我删除wait和if-else块并输入一个简单的printf语句printing I时。输出非常奇怪。我的意思是,当fork在那里时,我没有看到循环中发生了什么?不要删除wait。等待在那里,printf现在在正确的位置,您应该会得到预期的输出。请使用新代码更新输出运行。
for(i=1;i<=4;i++)
{
int pid=fork();
printf("\nvalue of i is %d",i)
}