【问题标题】:why does this fork() out put produce 8 instead of 5?为什么这个 fork() 输出产生 8 而不是 5?
【发布时间】:2015-12-20 00:56:05
【问题描述】:

所以我必须找到使用fork() 方法的这段代码的输出。我以为输出是 5 "hello" 但我得到了 8。这是为什么呢?这是代码:

#include "csapp.h"

void doit()
{
    Fork();
    Fork();
    printf("hello\n");
    return;
}

int main()
{
    doit();
    printf("hello\n");
    exit(0);
}

【问题讨论】:

  • 我不知道有什么函数叫做Fork()。你确定不是fork()
  • 提示:2*2^2=8 .....
  • 你为什么期望 5?您将 1 个进程分成 2 个,然后将 2 个进程分成 4 个,然后每个进程打印两次“hello”。
  • printf("hello from %d\n", getpid() ); 可以帮助您了解所有问候的来源。
  • fork 不是方法,而是函数

标签: c linux fork


【解决方案1】:

这是您的代码正在执行的操作:

main->doit()->Fork()->Fork()->printf()->return->printf()->exit()
                |       |
                |       ----->printf()->return->printf()->exit()
                |
                ----->Fork()->printf()->return->printf()->exit()
                        |
                        ----->printf()->return->printf()->exit()

如您所见,您总共有 8 次调用 printf()

如果您选择在 maindoit 函数中打印不同的字符串,您会更容易看到发生了什么。

在每个printf() 调用上设置断点是解决此类问题的另一种有效策略。

【讨论】:

    【解决方案2】:

    您创建流程 #1。在打印任何内容之前,进程#1 调用fork() 并生成一个我们将称为进程#2 的克隆。进程#1 和#2 再次调用fork(),克隆到进程#3 和#4。现在您有 4 个进程,每个进程都会打印两次hello。打印了多少hello

    【讨论】:

      【解决方案3】:

      首先你调用 fork 并且你的一个进程分叉成两个。然后在每个结果进程中调用fork,一共4个。然后4个进程打印hello,return,再打印hello,一共8个hello。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-03
        • 2021-03-21
        • 2013-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-06
        • 2021-10-07
        相关资源
        最近更新 更多