难以理解分叉逻辑

Trouble Understanding Fork Logic

有人可以帮助我了解这段代码中发生了什么吗?我无法理解为什么输出是这样的。输出为:

0 1 2 3 4

3

2

1

0

int main() {
   int i;

   for (i = 0; i < 5 && !fork(); i++) {
      fflush(stdout);
      printf("%d ", i);
   }
   wait(NULL);

   printf("\n");
   return 0;
}

这里有两件事:

首先,fork() return 0 在子进程中,而它 return 是父进程的非零 pid。

二、&&短路。

因此在第一个进程 (p0) 的开头,它运行到 i < 5 && !fork()。现在 i = 0 并创建了另一个进程 (p1)。现在对于 p0,test !fork() 失败,它结束 for 循环并等待 child 结束。对于 p1,测试成功,并打印出 0,然后将 i 递增到 1,然后它将创建进程 p2 并像 p0 一样退出 for 循环。

因为短路,当i等于5时,不会再调用fork