C语言fork函数机制图解
代码
/*
* fork_test.c
* version 2
* Created on: 2010-5-29
* Author: wangth
*/
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int i=0;
printf("i son/pa ppid pid fpid/n");
//ppid指当前进程的父进程pid
//pid指当前进程的pid,
//fpid指fork返回给当前进程的值
for(i=0;i<2;i++){
pid_t fpid=fork();
if(fpid==0)
printf("%d child %4d %4d %4d/n",i,getppid(),getpid(),fpid);
else
printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);
}
return 0;
}
输出结果
i son/pa ppid pid fpid
0 parent 2043 3224 3225
0 child 3224 3225 0
1 parent 2043 3224 3226
1 parent 3224 3225 3227
1 child 1 3227 0
1 child 1 3226 0
运行图解
fork运行图解
fork函数原理:调用时复制该进程的所有数据到另一块内存区,创建新的进程,紧接着执行fork()后的下一行函数
流程解析:
- 第一次for循环,只有3224进程能够执行fork函数,fork出了3225进程
- 第二次循环,3224,3225都执行了fork函数,fork出了3226进程和3227进程,如图所示,总共被fork出的进程有3个,总共执行了6次printf
- 其他情况依此类推,初次被fork出的进程会直接执行fork()函数的下一句代码,避免递归fork,fork进程的变量值均为其父进程当前运行的变量值的复制,包括全局变量,因为整个进程状态都是即时拷贝的,包括父进程当前pc指针。