博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux for循环 fork() 产生子进程
阅读量:6186 次
发布时间:2019-06-21

本文共 995 字,大约阅读时间需要 3 分钟。

 

#include 
#include
#include
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。

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

 

转载于:https://www.cnblogs.com/zhaihongliangblogger/p/6367012.html

你可能感兴趣的文章
JavaScript函数继承与伪类继承
查看>>
NGUI的输入框制作(attach- input filed script的使用)
查看>>
回溯法——批处理作业调度
查看>>
【阿里面试题】Java中的类及方法的加载顺序
查看>>
Eclipse “cannot be resolved to a type” error
查看>>
笔试题
查看>>
【java集合框架源码剖析系列】java源码剖析之TreeMap
查看>>
【POI】对于POI无法处理超大xls等文件,官方解决方法【已解决】【多线程提升速率待定】...
查看>>
定义函数指针
查看>>
bcg库使用心得两则
查看>>
Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)
查看>>
从《谍中谍4》看知识经济时代团队的特点
查看>>
在稳定性测试中,将测试结果持续填加进入html报告
查看>>
python pytest测试框架介绍二
查看>>
如何往jumpserver上添加服务器
查看>>
Android dialog 问题
查看>>
用户,群组和权限 四
查看>>
Windows 窗体—— 键盘输入工作原理
查看>>
display: flexbox
查看>>
对二叉树三种遍历的理解
查看>>