【问题标题】:Trouble Understanding Fork Logic难以理解分叉逻辑
【发布时间】:2015-07-25 13:38:27
【问题描述】:

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

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() 系统调用基本上会创建任何内容的重复副本过程正在创建它。原始进程从fork() 获得一个非零(因此,“true”) 返回码。孩子得了零。对您来说不幸的是,“编写此代码的原始程序员”从未努力明确他/她的意图。 . .

标签: process fork system-calls


【解决方案1】:

这里有两件事:

首先,fork() 在子进程中返回 0,而它向父进程返回一个非零 pid。

二、&amp;&amp;短路。

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

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

【讨论】:

  • 你能解释一下 fflush(stdout) 调用是如何工作的吗?在我看来,数字将是双重打印,因为在缓冲区上调用了刷新然后打印?
  • 在我的理解中,fflush 会刷新流缓冲区,这意味着如果有东西,它将被刷新。如果它是空的,你什么都没有。打印时,它首先进入缓冲区。但是如果你调用 fflush,结果会更快地显示出来,而不是在流关闭或满时等待被刷新。
猜你喜欢
  • 2010-10-28
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2020-07-19
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多