【问题标题】:How is fork() able to produce varied results?fork() 如何产生不同的结果?
【发布时间】:2021-03-15 00:20:43
【问题描述】:
#include <stdio.h>
#include <unistd.h>

int main()
{
    int x = 1;

   /* fork off a child process */
    if (fork()==0)
       x++;

    /* fork off another child process */
    if (fork()==0)
       x++;

    printf("x = %d : ", x); fflush(stdout);

    /* wait for a signal to be received */
    pause();
}

每次运行它都会给出不同的结果。我试过阅读原因,但我很难理解它。这可能的输出是什么?为什么?

【问题讨论】:

  • 取决于执行什么进程的顺序
  • @Ed Heal,我见过人们说“我已经实现了 X”,意思是“我已经实现了调用 X 的代码”(“我已经使用了 X”)很多次。我怀疑是误译。是的,这是不正确的,但有更好的方法让人们知道这一点。

标签: c output fork


【解决方案1】:

每个进程的输出是完全确定的(假设没有错误)。

P1                        P11                       P111
+----------------+        + - - - - - - - -+        + - - - - - - - -+
|  x = 1;        |        :  x = 1;        :        :  x = 1;        :
|  fork(); // !0 |------->:  fork(); // =0 :        :  fork(); // =0 :
|  fork(); // !0 |---+    |  ++x;          |        :  ++x;          :
|  printf();     |   |    |  fork(); // !0 |------->:  fork(); // =0 :
+----------------+   |    |  printf();     |        |  ++x;          |
                     |    +----------------+        |  printf();     |
                     |                              +----------------+
                     |
                     |    P12
                     |    + - - - - - - - -+
                     |    :  x = 1;        :
                     |    :  fork(); // !0 :
                     +--->:  fork(); // =0 :
                          |  ++x;          |
                          |  printf();     |
                          +----------------+
  • P1 输出1
  • P11 输出2
  • P111 输出3
  • P12 输出2

但是,根据调度的变化,每个进程的输出出现的顺序是不可预测的。

【讨论】:

  • 一个很好的解释图。希望我能提供额外的描述!
  • ++x 在原始问题中是 x++
  • @Simson,您可能已经注意到这些框也不包含其他方面的确切代码。我写的是代码的效果而不是实际的代码。
  • 哇,这张图很有帮助!谢谢!感谢您将要执行的代码放入每个框中。这真的帮助我更好地想象发生了什么。听起来调度是导致结果不同的原因,这可以解释为什么它总是打印相同的 4 位数字的组合。
  • 是的,没错。永远不要害怕拿出一支铅笔和一张纸来追踪正在发生的事情。欢迎。
猜你喜欢
  • 2018-05-23
  • 2017-09-11
  • 2020-03-14
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多