很有意思,分析一下,加深一下对fork机制的理解。代码如下:
题目:请问下面的程序一共输出多少个“-”?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-");
}
wait(NULL);
wait(NULL);
return 0;
}
这道题里面其实有两个地方需要注意,要不然就没法得到正确的答案。第一个就是fork函数的特点,一次调用,两次返回,第一次返回0,为子进程,第二次返回值为子进程的pid,为父进程,按照这思路分析,想想题目应该有多少个’-‘输出。
假设第一个进程为A,i==0时,A调用fork,这时候fork第一次返回是子进程B,这之后打印出了第1个’-‘,fork第二次返回是父进程A,然后就打印出了第2个’-‘. 当i==1时,进程A和进程B都会轮流调用fork,这时候就会递归i==0的过程。所有按照这个分析思路最后结果应该为6个’-‘。
可是,很遗憾,答案是8个。为什么呢?
当父进程在调用fork创建一个子进程的时候,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。由于printf没有输出换行符,这时候,缓冲区会一直存储直到满,才会flush. 这时候相信大家开始明白为什么答案是8了。没错,当i==1的时候,父进程再次调用fork并第一次返回的时候,会输出两个’-‘,
同样进程B调用fork并第一次返回的时候,也会输出两个’-‘.所以,(1+1)+((1+1)+1+(1+1)+1)=8.