文档介绍:同学参加了 EMC 的笔试回来,说了一个 EMC 的一个笔试题目,他没有答上
来,就问我。我感觉很有意思,就拿出来分析一下
int main(int argc, char* argv[])
{
fork();
fork() && fork() || fork();
fork();
}
为了解答这个问题,我们先作一下弊,先用程序验证一下,到此有多少个进
程。
int main(int argc, char* argv[])
{
fork();
fork() && fork() || fork();
fork();
printf("+\n");
}
在代码最后加一个 printf 语句,看最后有多少行,就说明有多少进程。
答案是总共 20 个进程,出去 main 进程,还有 19 个进程。
我们再来仔细分析一下,为什么是还有 19 个进程。
第一个 fork 和最后一个 fork 肯定是会执行的。主要在中间 3 个 fork 上,
可以画一个图进行描述。这里就需要注意&&和||运算符。
A&&B,如果 A=0,就没有必要继续执行了;A 非 0,就需要继续执行&&B。
A||B,如果 A 非 0,就没有必要继续执行了,A=0,就需要继续执行||B。
fork()对于父进程和子进程的返回值是不同的,按照上面的 A&&B 和 A||B 的分支
进行画图,可以得出 5 个分支。
加上前面的 fork 和最后的 fork,所有的进程都会执行,会产生 4 个分支,总共
4*5=20 个分支,也就是 20 个进程,除去 main 主进程,就是 19 个进程了。
前两天有人问了个关于 Unix 的 fork()系统调用的面试题,这个题正好是我
大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分
享一下。这个题是这样的:
#include <>
#include <sys/>
#include <>
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-");
}
return 0;
}
如果你对 fork()的机制比较熟悉的话,这个题并不难,输出应该是 6 个“-”,但
是,实际上这个程序会很 tricky 地输出 8 个“-”。
要讲清这个题,我们首先需要知道 fork()系统调用的特性,
• fork()系统调用是 Unix 下以自身进程创建子进程的系统调用,一次调用,
两次返回,如果返回是 0,则是子进程,如果返回值>0,则是父进程(返回
值是子进程的 pid),这是众为周知的。
• 还有一个很重要的东西是,在 fork()的调用处,整个父进程空间会原模
原样地复制到子进程中,包括指令,变量值,程序调用栈,环