Linux的分叉系统调用

5

最近我参加了一家知名IT公司的技术面试。 面试官问我下列3个不同的fork系统调用调用时会创建多少进程:

  1. fork()

  2. fork()
    fork()

  3. fork()
    fork()
    fork()

第一个问题的答案显然是2个进程。
第二个问题将启动3个进程。
但是对于第三个问题,我回答是5个进程,面试官不同意,并说它是7个进程。
我无法想象如何创建7个进程。
请帮忙。


1
如果实际过程不计算的话,我认为答案分别是1、3和7,即2^1-1、2^2-1和2^3-1。 - alexgirao
@alexgirao 没错... 但是面试官可能没有有效地描述所需的响应情况。 - Tom Pace
4个回答

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);
}

And then just run it as: pgm | sort | uniq

9314
9317
9318
9319
9320
9321
9322
9323

总共有8个进程,其中7个是已创建的。


3
第三个:
fork()
fork()
fork()

在第一次叉时,您将拥有两个进程。因此,第二次叉由两个进程调用。因此,在第二次叉之后,您将拥有4个进程()。第三次叉由所有4个进程调用,创建了4个进程。因此,您总共有8个进程,其中7个进程是由叉创建的。
因此,对于n次叉,将有总共2^n个进程,其中2^n-1个进程是由叉创建的。

0

在@Duck的想法上延伸,您可以在命令行上进行简单的实验

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

这应该产生类似于

6792
6795
6796
6797
6798
6799
6800
6801

确认,确实有三个分支会创建2^3-1个进程。

0
以下链接是关于这个主题的另一个堆栈溢出问答,可能有助于澄清您的问题。 Problem forking fork() multiple processes Unix 那个人调用了5次fork(),最终产生了31个新进程。(2^forks-1个原始进程)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接