Process 理解Fork逻辑的困难

Process 理解Fork逻辑的困难,process,fork,system-calls,Process,Fork,System Calls,有人能帮我理解这段代码中发生了什么吗?我很难理解为什么输出是这样的。输出为: 01 2 3 4 三, 二, 一, 0 intmain(){ int i; 对于(i=0;i

有人能帮我理解这段代码中发生了什么吗?我很难理解为什么输出是这样的。输出为:

01 2 3 4

三,

二,

一,

0

intmain(){
int i;
对于(i=0;i<5&&!fork();i++){
fflush(stdout);
printf(“%d”,i);
}
等待(空);
printf(“\n”);
返回0;
}
这里有两件事:

首先,
fork()
返回子进程中的
0
,同时将非零pid返回给父进程

第二,短路
&&

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


由于短路,当
i
等于5时,将不再调用
fork

哦,您刚刚遇到了“一个程序员‘太聪明了一半’”,
fork()
系统调用基本上创建了创建它的任何进程的副本。原始进程从
fork()
获取非零(因此为“true”)返回代码。这孩子得零分。不幸的是,“编写此代码的原始程序员”从未试图明确他/她的意图。你能给我解释一下fflush(stdout)调用是如何工作的吗?在我看来,数字是双重打印的,因为在缓冲区上调用flush,然后进行打印?在我的理解中,flush刷新流缓冲区,这意味着如果有什么东西,它将被刷新。如果它是空的,你什么也得不到。打印时,它首先进入缓冲区。但是如果调用fflush,结果将更快地显示,而不是在流关闭或已满时等待刷新。
int main() {
   int i;

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

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