LINUX 循环fork()

简介: <div id="cnblogs_post_body"> <p><span>#include <sys/types.h></span><br><span>  #include <unistd.h></span><br><span>  int main()</span><br><span>  {</span><br><span> </span><span>  </s

#include <sys/types.h>
  #include <unistd.h>
  int main()
  {
            for(int i = 0; i < 3; i ++)
      {
              int pid = fork();
              if(pid == 0)
              {
                   printf("child\n");
               }
               else
               {
                    printf("father\n");
                }
       }
   return 0;
  }
  请问输出结果是什么?
  初看,想当然认为结果是3对child-father,只是顺序不确定,而且按照Unix环境高级编程中的说法,极端的情况下可能还会出现两个输出的内容相互夹杂的情况。
  但是,在Unix测试了一下发现输出竟然有7对child-father。为什么会这样呢?看了半天程序终于明白了这个简单的问题。其实,这个问题在写/懂汇编的人看来是再清楚不过了,问题就出在这个for循环。
  1.i=0时,父进程进入for循环,此时由于fork的作用,产生父子两个进程(分别记为F0/S0),分别输出father和child,然后,二者分别执行后续的代码,那后续的代码是什么呢?return 0?当然不是,由于for循环的存在,后续的代码是add指令和一条jump指令,因此,父子进程都将进入i=1的情况;
  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。其对应的数学公式为:
  1 + 2 + 4 + ... + 2^(n - 1) = 2^n - 1
  不过话说回来,这种在for循环中使用fork的作法实在不值得推荐,研究研究尚可,实际应用恐怕会引来很多麻烦,需小心谨慎才是。

相关文章
|
6月前
|
算法 Linux Shell
Linux:进程的本质和fork初识
Linux:进程的本质和fork初识
|
7月前
|
安全 Linux 调度
15.3 【Linux】循环执行的例行性工作调度
15.3 【Linux】循环执行的例行性工作调度
35 0
|
9月前
|
Shell Linux
Linux操作系统实验七 Shell编程之循环程序编程(下)
Linux操作系统实验七 Shell编程之循环程序编程(下)
118 0
|
1天前
|
算法 Linux Shell
【linux进程(二)】如何创建子进程?--fork函数深度剖析
【linux进程(二)】如何创建子进程?--fork函数深度剖析
|
1月前
|
算法 Linux Shell
fork函数详解【Linux】
fork函数详解【Linux】
|
2月前
|
算法 Shell Linux
Linux的shell命令——判断与循环
Linux的shell命令——判断与循环
38 1
|
3月前
|
存储 NoSQL 物联网
『 Linux 』使用fork函数创建进程与进程状态的查看(下)
『 Linux 』使用fork函数创建进程与进程状态的查看(下)
|
3月前
|
Linux Shell Windows
『 Linux 』使用fork函数创建进程与进程状态的查看(上)
『 Linux 』使用fork函数创建进程与进程状态的查看(上)
|
4月前
|
算法 Unix Linux
Linux系统编程(vfork和fork)
Linux系统编程(vfork和fork)
33 0
|
9月前
|
Shell Linux
Linux操作系统实验七 Shell编程之循环程序编程(中)
Linux操作系统实验七 Shell编程之循环程序编程(中)
86 0