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

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

 

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值