linux for循环 fork() 产生子进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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环境高级编程中的说法,极端的情况下可能还会出现两个输出的内容相互夹杂的情况。
但是,在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的作法实在不值得推荐,研究研究尚可,实际应用恐怕会引来很多麻烦,需小心谨慎才是。
以上是关于linux for循环 fork() 产生子进程的主要内容,如果未能解决你的问题,请参考以下文章
在一个for循环体内执行n次的fork()函数创建n个子进程, 那么这些子进程的父进程是哪些 ?
linux下fork两子进程为啥只有一个读取到pipe的内容?
linux C/C++多进程教程(多进程原理以及多进程的应用以多连接socket服务端为例(fork子进程处理socket_fd),同时介绍了僵尸进程产生原因与解决方法)(getpidfork)