java小程序: 一段关于fork的小程序的启示(z..来源: 发布时间:星期四, 2008年12月11日 浏览:13次 评论:0
前几天论坛上有人问了这样个问题:
Jicfbaiducuk4LV# <sys/types.h> Jicfbaiducuk4LV# <unistd.h> Jicfbaiducuk4LV Jicfbaiducuk4LV Jicfbaiducuk4LV{ Jicfbaiducuk4LV for( i = 0; i < 3; i ) Jicfbaiducuk4LV { Jicfbaiducuk4LV pid = fork; Jicfbaiducuk4LV (pid 0) Jicfbaiducuk4LV { Jicfbaiducuk4LV prf("child\n"); Jicfbaiducuk4LV } Jicfbaiducuk4LV Jicfbaiducuk4LV { Jicfbaiducuk4LV prf("father\n"); Jicfbaiducuk4LV } Jicfbaiducuk4LV } Jicfbaiducuk4LV 0; Jicfbaiducuk4LV} Jicfbaiducuk4LV Jicfbaiducuk4LV请问输出结果是什么? Jicfbaiducuk4LV Jicfbaiducuk4LV初看想当然认为结果是3对child-father只是顺序不确定而且按照Unix环境高级编程中说法极端情况下可能还会出现两个输出内容相互夹杂情况 Jicfbaiducuk4LV Jicfbaiducuk4LV但是在Unix测试了下发现输出竟然有7对child-father为什么会这样呢?看了半天终于明白了这个简单问题其实这个问题在写/懂汇编人看来是再清楚不过了问题就出在这个for循环 Jicfbaiducuk4LV1.i=0时父进程进入for循环此时由于fork作用产生父子两个进程(分别记为F0/S0)分别输出father和child然后二者分别执行后续代码那后续代码是什么呢? 0?当然不是由于for循环存在后续代码是add指令和条jump指令因此父子进程都将进入i=1情况; Jicfbaiducuk4LV2.i=1时父进程继续分成父子两个进程(分别记为F1/S1)而i=0时fork出子进程也将分成两个进程(分别记为FS01/SS01)然后所有这些进程进入i=2; Jicfbaiducuk4LV3.....过程于上面类似已经不用多说了相信切都已经明了了依照上面标记方法i=2时将产生F2/S2,FS12/SS12,FFS012/SFS012,FSS012/SSS012. Jicfbaiducuk4LV因此最终结果是输出7对child/father其对应数学公式为: Jicfbaiducuk4LV1 + 2 + 4 + ... + 2^(n - 1) = 2^n - 1 Jicfbaiducuk4LV Jicfbaiducuk4LV不过话说回来这种在for循环中使用fork作法实在不值得推荐研究研究尚可实际应用恐怕会引来很多麻烦需小心谨慎才是 Jicfbaiducuk4LV 0
相关文章
读者评论
发表评论 |