[lizhe@localhost fork]$ ./exe
pid:4071
------
问以下代码的执行结果
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
int pid=0;
for(int i=0;i<3;i++){
pid=fork();
printf("pid:%d\n",pid);
printf("------\n");
}
}
结果如下,有点吃惊
pid:0
pid:4072
------
------
pid:4074
------
pid:4073
------
pid:0
------
pid:0
------
pid:4077
------
pid:0
------
pid:0
------
pid:4078
------
pid:0
------
pid:4079
------
pid:0
------
原来,每次fork一个子进程后,它都分享父进程的内存区域,所以每个fork出的子进程会接着执行循环。
执行第一次的时候,fork出一个进程,第二次执行的时候,连同上次的子进程也会产生子进程,故而1变2,2变4,4变8......
循环执行n次后总共有2的n次方个进程,新进程数则为2的n次方减1.
由于每个进程都要执行一次printf语句,故printf总共执行的次数为2+4+8+16……本例的循环执行3次,printf了14次。