linux fork系统调用

时间:2013-12-08 06:26:19

标签: linux fork

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

  1. fork()

  2. 叉()
    fork()

  3. 叉()
    叉()
    fork()

  4. 第一个答案是明显的2个过程 第二个将开始3个过程 在第3个我讲的是5个过程,面试官不同意并且说它是7 我无法弄清楚它是如何创造7个过程的 请帮忙。

4 个答案:

答案 0 :(得分:6)

您需要确定采访者是关于全部流程还是创建流程。这是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个已创建的进程。

答案 1 :(得分:3)

第三个:

fork()
fork()
fork()

在第一个分支之后,您有2个进程。所以第二个fork由2个进程调用。所以,在第二个fork()之后你有4个进程。所有4个进程调用第三个fork,再创建4个进程。因此,您总共有8个进程,其中创建了7个进程。

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

答案 2 :(得分:0)

以下链接是关于此主题的另一个堆栈溢出Q-A,可能有助于为您清除事物。

Problem forking fork() multiple processes Unix

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

答案 3 :(得分:0)

延伸@Duck的想法,你可以在命令行上做一个简单的实验

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

应该产生类似

的东西
6792
6795
6796
6797
6798
6799
6800
6801

确认,实际上,三个叉子创造了2 ^ 3-1个过程