【问题标题】:linux fork system calllinux fork 系统调用
【发布时间】:2013-12-08 06:26:18
【问题描述】:

最近,我在一家知名 IT 公司接受了技术面试。 面试官问我如果给出以下 3 种不同的 fork 系统调用调用会创建多少个进程:

  1. fork()

  2. fork()
    fork()

  3. fork()
    叉子()
    fork()

第一个问题的答案显然是 2 个过程。
第二个将启动 3 个进程。
bt 我告诉的第三个是 5 个过程,面试官不同意并说它是 7 个。
我不知道它是如何创建 7 个进程的。
请帮忙。

【问题讨论】:

  • 如果不计算实际过程,我认为答案是1、3和7分别为2^1-1、2^2-1和2^3-1
  • @alexgirao 确切地说...但是面试官可能没有有效地描述这种情况以获得期望的响应。

标签: linux fork


【解决方案1】:

您需要确定面试官是总流程还是创建流程。这是 posix 系统上的一种简单技术(在大多数 fork 谜题中)。

int main(int argc, char *argv[])
{
    fork();
    printf("%d\n", getpid());
    fork();
    printf("%d\n", getpid());
    fork();
    printf("%d\n", getpid());

    return(0);
}

然后将其运行为:pgm | sort | uniq

9314
9317
9318
9319
9320
9321
9322
9323

8 个进程,7 个创建进程。

【讨论】:

    【解决方案2】:

    第三个:

    fork()
    fork()
    fork()
    

    第一次分叉后,您有 2 个进程。因此,第二个 fork 由 2 个进程调用。因此,在第二个 fork() 之后有 4 个进程。第三个 fork 被所有 4 个进程调用,创建了另外 4 个进程。因此,您总共有 8 个进程,其中创建了 7 个进程。

    因此,对于 n 个分叉,将总共有 2^n 个进程,其中 2^n-1 进程是由于分叉而创建的。

    【讨论】:

      【解决方案3】:

      以下链接是关于此主题的另一个堆栈溢出问答,可能有助于您清除问题。

      Problem forking fork() multiple processes Unix

      那个人有 5 次 fork() 调用,最终产生了 31 个新进程。 (2^forks-1 原始进程)

      【讨论】:

        【解决方案4】:

        扩展@Duck的想法,可以在命令行做一个简单的实验

        perl -le'fork; fork; fork; print $$'  # $$ is the pid
        

        应该产生类似的东西

        6792
        6795
        6796
        6797
        6798
        6799
        6800
        6801
        

        确认,确实,三个分叉创建了 2^3-1 个进程

        【讨论】:

          猜你喜欢
          • 2015-12-22
          • 1970-01-01
          • 2011-06-10
          • 1970-01-01
          • 2012-02-02
          • 2016-01-13
          • 2016-12-14
          • 1970-01-01
          • 2023-03-14
          相关资源
          最近更新 更多