zoukankan      html  css  js  c++  java
  • 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
    ");
    15          }
    16          else
    17          {
    18                     printf("father
    ");
    19          }
    20      }
    21    return 0;
    22 }

    请问输出结果是什么?

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

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

    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的作法实在不值得推荐,研究研究尚可,实际应用恐怕会引来很多麻烦,需小心谨慎才是。

  • 相关阅读:
    计算机网络基础:TCP运输连接管理(三次握手 + 四次挥手)
    Zookeeper集群及配置
    Maven安装及配置
    SpringMVC拦截器+Spring自定义注解实现权限验证
    Spring之AOP配置
    设置Google浏览器不缓存JS
    数据加密之AES
    SpringMVC配置多个自定义拦截器
    利用Zookeeper实现分布式锁
    数据加密之RSA
  • 原文地址:https://www.cnblogs.com/zhaihongliangblogger/p/6367012.html
Copyright © 2011-2022 走看看