Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当fork在一个循环中时,为什么不是一个平衡树呢?_C_Ubuntu_Fork - Fatal编程技术网

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)
      }