最近,我在一家着名的IT公司接受了技术面试。 面试官问我,如果给出以下3个不同的fork系统调用调用,将创建多少个进程:
fork()
叉()
fork()
叉()
叉()
fork()
第一个答案是明显的2个过程 第二个将开始3个过程 在第3个我讲的是5个过程,面试官不同意并且说它是7 我无法弄清楚它是如何创造7个过程的 请帮忙。
答案 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个过程