【问题标题】:Help with output generated by this C code using fork()使用 fork() 帮助此 C 代码生成的输出
【发布时间】:2010-04-13 00:00:15
【问题描述】:

我正在尝试使用 fork() 找出一段 C 代码的输出,但我在理解它为什么会这样出现时遇到了一些问题。我知道当使用 fork() 时,它会并行启动程序的另一个实例,并且子实例将返回 0。有人可以逐步解释下面代码块的输出吗?谢谢你。 编辑:我忘记在 FOR 循环后添加 EXIT(1)。我的道歉。

main() { int status, i;
         for (i=0; i<2; ++i){
             printf("At the top of pass %d\n", i);
             if (fork() == 0){
                printf("this is a child, i=%d\n", i);
             } else {
                 wait(&status);
                 printf("This is a parent, i=%d\n", i);
               }
          }
          exit(1);
}

【问题讨论】:

  • ...是如何产生的
  • 你为什么不告诉我们输出以及它有什么令人困惑的地方。
  • 你运行了吗?因为这是一个测试程序,所以我会做第一步。当您查看输出时,您可以轻松推断出发生了什么,不是吗?
  • 是否应该不读取第一个条件:if ((status = fork()) == 0){ 而不是 - 这样等待实际上是在等待父级的 PID?
  • 我的意思是我想在运行之前预测输出。

标签: c fork


【解决方案1】:

第一个循环发生的是第一个进程分叉。一个,fork() 返回 0,另一个返回子进程的 pid 所以你会得到一个打印出“这是一个孩子”和一个打印出“这是一个父母”的结果。这两个过程都继续循环,将i 增加到 1 并再次增加fork()。现在你有四个进程:两个孩子和两个父母。所有四个进程都会将i 增加到 2 并跳出循环。

如果你将循环终止条件增加到i&lt;3,那么下一次循环时所有四个进程都将执行fork(),你总共有八个进程。如果循环中没有限制,您将有一个fork bomb,您将在每个循环中以指数方式创建越来越多的进程,直到系统耗尽资源。

【讨论】:

  • 人力资源部。我想我分别数3和6。也许我需要自己实际运行代码......
  • 一个小笨蛋。 这两个过程都在循环中继续是不完全正确的;由于父母已调用等待,因此只有孩子继续循环;该特定分叉的父级在子级退出之前不会继续。
  • 啊,第二次运行 7。但我明白为什么了。
  • @R Samuel Klatchko:哦,你说得对,我没注意到wait()
  • 因此,在第一个循环中,当它分叉时,它不等于 0,所以它转到 else 并等待。现在在 fork 创建的新进程中,它到达 fork() == 0,应该是零吧?既然是孩子?那么它会先打印“这是一个孩子”还是会回到第一个循环并导致它打印“这是一个父母”然后它会打印“这是一个孩子”?之后两个进程会再次循环,每个进程都分叉吗?编辑:还是 Wait(&status) 等待孩子退出?
【解决方案2】:

这段代码可能很难解释。原因是第一个child没有退出,会自己调用fork。尝试修改代码以在每个打印行上包含进程 ID,例如:

printf("At the top of pass %d in pid %u\n", i, getpid());

然后注意孩子如何成为父母......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多