关于多进程编程中fork()函数返回两次的探究
来源:互联网 发布:淘宝高仿护照 编辑:程序博客网 时间:2024/05/12 16:45
可以每个接触到多进程编程的人在遇到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的函数,这个函数根据传入的值,然后会分别在子进程和父进程中执行,从而返回两次不同的值,具体过程和上面所说的实现思想差不多。
写的比较乱,也都是我个人的理解,如果有不对的地方,希望大神们能够指出来,非常感谢,同时也希望大家踊跃讨论一下。谢谢!
- 关于多进程编程中fork()函数返回两次的探究
- Linux编程中fork()函数返回两次的探究
- 理解多进程fork函数调用一次返回两次
- fork()函数两次返回
- FORK()函数的两次返回的具体情况
- fork()函数的两次返回的具体情况
- fork函数的两次返回和父子进程的执行顺序简介
- fork函数的两次返回和父子进程的执行顺序简介
- 关于fork()函数特性的一些探究
- 多进程编程:fork()函数
- [转帖]FORK()函数的两次返回的具体情况
- 关于进程(fork函数)
- 两次fork函数可以防止进程僵死的理解
- 多进程编程中fork
- 守护进程中fork一次与两次的区别
- 对fork()函数的探究
- 关于fork()函数的两个返回值
- fork()两次不同返回值的实现
- MeeGo观点集合
- Arithmetic Progressions等差数列
- 写给离去的乔布斯
- 【转】如何连接两台电脑同时上网
- 非常实用的口才训练方法
- 关于多进程编程中fork()函数返回两次的探究
- SQL Server 索引结构及其使用(一)
- 【转】用两个蓝牙适配器共享两台电脑同时上网
- 【转】实现两台笔记本通过无线共享上网
- Ethereal 与 Wireshark
- SQL Server 索引结构及其使用(二)
- 第一篇博客
- SQL Server 索引结构及其使用(三)
- 【转】windows7 系统下实现两台笔记本内置的无线局域网卡共享上网的设置方法