可以每个接触到多进程编程的人在遇到fork()函数的时候都会由一些疑惑,它怎么能返回两次?而且返回值不同。对于以前的认知大家都知道一个函数只能返回依次啊。

  呵呵,这是fork的神奇所在,它为什么这么神奇?它是怎么实现的?下面我根据自己得理解简单的说一下,不过另外也欢迎大家的讨论。

  首先要明白的是fork函数的作用,它是用来创建一个子进程,和父进程一样的子进程,是父进程的一个副本。

  子进程将会有自己的地址空间,并且会获得父进程的数据段的副本以及堆栈的副本,所获得的副本都是精确拷贝。所谓副本是一模一样的,包括变量,堆栈的结构。

  另外有一点是子进程和父进程共享代码段。

  fork函数如何返回两次值那?这要说到子进程的创建了。

  其实现过程大概是这样:

  首先在父进程中调用fork函数,在fork函数中开始的代码中首先创建一个子进程空间,获得一个进程ID,然后逐步将数据段以及堆栈都拷贝过去,因为子进程的数据段以及堆栈都和父进程一样,而且创建完成后会和父进程共享代码段,共同执行代码,所以fork创建完子进程后面的代码在子进程中也会执行,并且堆栈中也有fork函数等待返回,这样可以在fork下面的代码中进行实现返回值了,在父进程中执行的时候可以判断当前进程的PID,如果等于刚刚新建进程的PID则返回0,但是因为当前进程为父进程所以它的PID不会等于刚刚新建进程的PID,再往下执行如果不等于则返回刚刚新建进程的PID,这样父进程得到的fork返回值是新建子进程的PID。而在子进程中同样会执行fork剩下的代码,也会判断当前进程的PID是否等于刚刚新建进程的PID,结果是等于的,因为是在子进程中,其本身是刚刚新建的进程,所以既然等于则会返回0,这样子进程中得到的返回值是0,然后下面的代码段在父进程和子进程中执行时可以根据返回值的不同而执行不同的代码了。

  其实在linux中fork返回值的处理交给了一个do_fork的函数,这个函数根据传入的值,然后会分别在子进程和父进程中执行,从而返回两次不同的值,具体过程和上面所说的实现思想差不多。

  写的比较乱,也都是我个人的理解,如果有不对的地方,希望大神们能够指出来,非常感谢,同时也希望大家踊跃讨论一下。谢谢!