-3

请帮忙,这是我明天要面对的一个可能的面试问题:

找到的输出

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

2 回答 2

1

这里的关键是 fork() 将返回一个与新的子进程不同的值给原始进程。特别是,它返回 0 给孩子,而孩子的 pid 回到原来的。由此,您可以计算出输出。

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

于 2013-09-03T19:20:27.160 回答
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:
 }

这表示 :

每个父进程派生一个新进程并 break ,然后退出;

每个子进程打印 "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”。

没有刷新缓冲区,没有人知道正确的输出。因为 fork 还将缓冲区从 parent 复制到 child 。

于 2013-09-03T23:02:59.620 回答