关于多进程编程中fork()函数返回两次的探究

上一篇 / 下一篇  2012-09-11 14:29:44 / 个人分类:杂谈

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

tV$B5~Gg C&U5V7`-w0

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

N4CA7m#wI0

tG3yI4}A x b0  首先要明白的就是fork函数的作用,它是用来创建一个子进程,和父进程一样的子进程,就是父进程的一个副本。51Testing软件测试网 XW)J6J3O;ot

51Testing软件测试网&m/D%DhnzH

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

Q"?%T m$W9O0 51Testing软件测试网"A G"}"J Sg p8z?

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

5uZ _+s:b!Q)rI0

&j u4W D v0  fork函数如何返回两次值那?这就要说到子进程的创建了。51Testing软件测试网VR)zs/JyP)?td

51Testing软件测试网 Cd&NU:Nw Ub

  其实现过程大概是这样:

[3| Xa\.d0 51Testing软件测试网B Tp'z*W K6G

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

8T ]2d"DL$S,?Y0  其实在linux中fork返回值的处理交给了一个do_fork的函数,这个函数根据传入的值,然后会分别在子进程和父进程中执行,从而返回两次不同的值,具体过程和上面所说的实现思想差不多。51Testing软件测试网TS8{)e8f

};V\d{SQ0  写的比较乱,也都是我个人的理解,如果有不对的地方,希望大神们能够指出来,非常感谢,同时也希望大家踊跃讨论一下。谢谢!51Testing软件测试网 Mf)vbbC


TAG:

 

评分:0

我来说两句

Open Toolbar