在for循环中调用fork()

时间:2013-09-03 19:06:58

标签: c fork

请帮助,这是我明天要面对的一个可能的面试问题:找到输出

main()
{
 int tmp;
 for(i=0;i<9;i++)
 {
  tmp=fork();
  if(tmp>0)
  break;
  printf(“Hello”);
 }
}

2 个答案:

答案 0 :(得分:1)

这里的关键是fork()将返回与原始进程不同的值,而不是新的子进程。特别是,它将0返回给孩子,将孩子的pid返回给原始孩子。从那里,你可以找出输出。

(好吧,你可以使用puts()代替printf(),但由于你没有终止这些行,这使得输出有点不确定,正如@CharlieBurns指出的那样。)

答案 1 :(得分:0)

for(i=0;i<9;i++)
 {
  tmp=fork();
  if(tmp>0)   // if parent 
      break;
  printf(“Hello”);
  fflush(stdout);   // if add this , I know the output:
 }

这意味着:

每个父进程分叉一个新进程并中断,然后退出;

每个子进程打印“Hello”并分叉它的子进程。

         i=0           i=1                            i = 8
        fork          fork                            fork
process 0 --> process 1 --> process 2 ... ->process 8 -->  process9
     |         |      |        |    |        |      |       |
     |       "Hello"  |     "Hello" |       Hello"  |    "Hello"
    break          break          break            break

总计9“Hello”打印。

没有刷新缓冲区,没有人知道正确的输出。 Bacause fork还将缓冲区从父级复制到子级。