关于linux下fork()函数的解析:子进程继续创建子进程,如何停止?
先贴代码:
for(i = 0; i < 4; i++)
{
fork();
printf("a\n");
}
问:一共输出多少个a? 答:30个(2+4+8+16)
先说下思路:父进程创建子进程后,fork函数是让子进程完全拷贝父进程,包括父进程上下文,什么意思呢?就是说父进程的EIP(CPU的下一条指令地址)以及变量等等一律拷贝,也就是说,父进程执行过的代码子进程是不会再执行,子进程下一条该执行的命令与父进程完全一样!!!
解析:
i=0时;fork()后,产生一个子进程,然后父子进程共同printf各1次;共两次;
之后,父子进程都进入i=1:
- 父子进程都会fork,也就是父进程fork了一个新的子进程;i=0的子进程也fork了一个子进程,共4个进程,每个进程都继续往下执行,也就是printf一次;共4次
以此类推:也就是2+4+8+16=30次。具体看下图:
fork会让子进程拷贝一切父进程的信息,包括这里面的变量i的值,所以子进程不会一直循环的fork下去,在i=2时,子进程(称为p2吧)fork出p3,然后p2继续执行printf,fork后创建的p3子进程的执行位置也和p2一样为printf,同时该创建的p3子进程自然下一次循环是从i=3开始,当i=3完成之后,i变成4,所有由总父进程创建出来的子进程都同时结束。