for循环中的fork()有2次迭代

fork() in a for loop with 2 iterations

以下代码的输出是什么:

#include <stdio.h>

void main()
{
int i;

for (i=0;i<2;i++)
{
    fork();

    printf("1\n");
}

printf("2\n");

}

在讲座中,教授 运行 代码和输出有六个 1 和四个 2,但我不明白我们是如何获得这些数字的。

让我们以树的形式“绘制”流程,并标记出 printf 调用发生的位置,然后计算每种类型的 printf 调用:

                      parent
                        |
                      fork
                        ^
         parent -------/ \------------ child
           |                             |
        printf("1")                   printf("1")
           |                             |
     loop iterates                 loop iterates
           |                             |
          fork                          fork
           ^                             ^
 parent --/ \----- grandchild   child --/ \----- grandchild
   |                  |           |                 |
printf("1")       printf("1")  printf("1")       printf("1")
   |                  |           |                 |
loop ends         loop ends    loop ends         loop ends
   |                  |           |                 |
printf("2")       printf("2")  printf("2")       printf("2")
   |                  |           |                 |
proc ends         proc ends    proc ends         proc ends

正如我们所见,有六个 printf("1") 个调用和四个 printf("2") 个调用。

[我没有在printf调用中添加换行符,该图仅用于计算调用次数。实际输出可能因缓冲而异,具体取决于 stdout 目标。]