浅谈Linux中的fork()函数

函数原型

pid_t fork( void);
(pid_t 是一个 宏定义,其实质是int 被定义在# include< sys/types.h>中)
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

函数说明

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。而这个现有进程是所谓的父进程。

当创建一个子进程时,子进程的PCB只拷贝父进程的一部分,但是却完全拷贝了用户空间,也就是将父进程中用户空间的栈,库,堆,以及全局变量和局部变量都拷贝到子进程中,

父子进程的执行流程:

父进程是从第一行开始执行的,而子进程代码是从fork()后执行的,

如图是fork的执行过程


可见其父进程是从代码的第一行开始执行的,而子进程是从fork()之后执行的,执行过程虽然有差异,但是子进程是把父进程的所有代码拷贝到自己的用户空间的。

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
  (1)在父进程中,fork返回新创建子进程的进程ID;
(2)在子进程中,fork返回0;
(3)如果出现错误,fork返回一个 负值
那么我们现在来看个例题: 一个父进程中连续调用四个fork()函数 问会创建多少个子进程

这个图虽然有点丑,但是可以明确表示出其创建子进程的父子关系

首先父进程执行代码,执行四个连续的fork()函数,就会创建四个相同的子进程;

拿子进程A作为例子,程旭执行到第一个fork()时创建的进程A,进程A从第二个fork()执行,便有了A作为父进程的三个子进程,而a1是父进程A的第一个fork()创建出的子进程,便有了以a1为父进程的两个子进程a11 和a21,以这样的关系循环下去,其他的子进程便被创建出来了,所以最终创建了15个子进程。

猜你喜欢

转载自blog.csdn.net/aaa_cainiao_66666/article/details/80539016