一.说明:
1. 首先我们要知道一点,使用fork()函数创建子进程是父进程的一个复制品,子进程执行fork后面的程序,前面的程序不会去执行。
2. 这里主要说明的是,fork()函数会把父进程当前变量的值及fork()后面的代码段复制给子进程。
二.连续fork:
- 这里为了方便观察进程列表,使用while(1)让每个进程不退出。
int main(int argc, const char *argv[])
{
pid_t pid1=0,pid2=0;
printf("代码段1\n\r");
pid1=fork();
pid2=fork();
printf("代码段2:进程id=%d,父进程id=%d,pid1=%d,pid2=%d\n\r",getpid(),getppid(),pid1,pid2);
while(1);
return 0;
}
- 程序执行结果
这里可以看到,代码段1只执行了一次,代码段2执行了4次,当前最小的进程号是父亲进程,父亲进程的父进程号是当前运行这个命令的终端进程号。
- 分析:
从下面我画的这两张图已经很形象的说明了创建的过程及创建的结果,第一次fork(),子进程“复制”了一份程序并去执行fork下面的程序,这时候只有pid1被改变,pid2没有被改变,第二次fork()时pid1保留上一次fork()被改变的值,pid1不变,只有pid2被赋值改变。阶段1只是个过程,阶段2才是最终的结果。这里需要注意的是,四个进程执行循序按内核调度算法来执行,所以输出的先后结果不一定相同。
三.分开fork:
分开fork()与连续fork()的结果是不一样的,第一次fork()完成之后又在父进程第二次fork(),所以分开fork会产生3个进程(包括父进程),而连续fork会产生4个进程(包括父进程)。