linux for循环 fork() 产生子进程

 示例:编程

 1 #include <sys/types.h>
 2 
 3 #include <unistd.h>
 4 
 5 #include<stdio.h>
 6 
 7 int main()
 8 {
 9    for(int i = 0; i < 3; i ++)
10    {
11          int pid = fork();
12          if(pid == 0)
13          {
14                    printf("child\n");
15          }
16          else
17          {
18                     printf("father\n");
19          }
20      }
21    return 0;
22 }

 

请问输出结果是什么?测试

初看,想固然认为结果是3对child-father,只是顺序不肯定,并且按照Unix环境高级编程中的说法,极端的状况下可能还会出现两个输出的内容相互夹杂的状况。spa

可是,在Unix测试了一下发现输出居然有7对child-father。code

1.i=0时,父进程进入for循环,此时因为fork的做用,产生父子两个进程(分别记为F0/S0),分别输出father和child,而后,两者分别执行后续的代码,那后续的代码是什么呢?return 0?固然不是,因为for循环的存在,后续的代码是add指令和一条jump指令,所以,父子进程都将进入i=1的状况;blog

2.i=1时,父进程继续分红父子两个进程(分别记为F1/S1),而i=0时fork出的子进程也将分红两个进程(分别记为FS01/SS01),而后全部这些进程进入i=2;进程

3.....过程于上面相似,已经不用多说了,相信一切都已经明了了,依照上面的标记方法,i=2时将产生F2/S2,FS12/SS12,FFS012/SFS012,FSS012/SSS012.数学

 

所以,最终的结果是输出7对child/father。其对应的数学公式为:io

 

1 + 2 + 4 + ... + 2^(n - 1) = 2^n - 1

 

不过话说回来,这种在for循环中使用fork的做法实在不值得推荐,研究研究尚可,实际应用恐怕会引来不少麻烦,需当心谨慎才是。for循环

相关文章
相关标签/搜索