【问题标题】:Could someone explain how fork works?有人能解释一下 fork 是如何工作的吗?
【发布时间】:2015-04-14 21:41:40
【问题描述】:

我真的不明白 fork() 是如何工作的。我理解一个 fork 的例子,但是当有多个调用时我不明白。我有一个这样的例子,它打印 4 行你好,如何创建了很多进程?

int main(void)
{
       fork();
       fork();
       printf("hello\n");

       return 0;
}

【问题讨论】:

标签: c unix fork posix


【解决方案1】:

fork() 调用之后,两个进程(原始的和衍生的)继续从下一行代码执行。所以两个进程都执行第二条fork() 指令,所以最后你有 4 个进程。因此,您会看到打印了 4 个 "hello" 行实例。

一张图抵千言:

【讨论】:

    【解决方案2】:

    fork() 系统调用实质上创建了执行它的进程的“克隆”。两个“克隆”运行几乎相同(返回值fork() 除外)。 对 fork() 的第一次调用由一个进程(我们称其为“P”)执行,它创建了第二个进程“C”。现在有两个进程,它们都执行 main() 函数中的第二行。因此两个进程 P 和 C 创建了一个新进程。这就是为什么你最终总共有 4 个进程,所有这些进程都只打印一次“hello”。

    以下示例可能会使该行为更加清晰:

    int main() { printf("进程 %d: 开始\n", getpid()); int r1 = fork(); printf("进程 %d: 第一个 fork() 返回 %d\n", getpid(), r1); int r2 = fork(); printf("进程 %d: 第二个 fork() 返回 %d\n", getpid(), r2); }

    在我的系统上,它输出以下内容:

    进程 12953:开始 进程 12953:第一个 fork() 返回 12954 进程 12954:第一个 fork() 返回 0 进程 12953:第二个 fork() 返回 12955 进程 12955:第二个 fork() 返回 0 进程 12954:第二个 fork() 返回 12956 进程 12956:第二个 fork() 返回 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2023-01-18
      • 2014-10-11
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多