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

发表于:2012-9-10 09:58

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:songjinshi    来源:51Testing软件测试网采编

分享:

  可以每个接触到多进程编程的人在遇到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的函数,这个函数根据传入的值,然后会分别在子进程和父进程中执行,从而返回两次不同的值,具体过程和上面所说的实现思想差不多。

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

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号