参考自:http://blog.csdn.net/dog_in_yellow/archive/2008/01/13/2041079.aspx

以前一直迷惑,什么叫一次调用,两次返回。通过上网搜索,终于知其原由。现将自己的理解记录于此。
       准备知识:
              内存中的进程包括三个部分:可执行文件(即程序),相关数据(包括变量,内存空间,缓冲区等),上下文环境(个人理解为从哪儿来,到哪儿去)。我们知道,电脑CPU资源有限,单核就只有一个,多核也不是无限多。而当前运行的程序个数总是多于CPU个数的(这个应该是可以想得通的,没有哪个制造商或个人那么阔气而浪费CPU)。因此在操作系统的调度之下,一个程序一般不会从头执行到尾而不间断,系统会按照程序执行的顺序、优先级别等来确实由哪个程序占用当前CPU。而被间断的那些程序就需要保存间断时刻的状态(即进程的三个部分都要记录下来),以便再次执行能够完全恢复到间断以前,如果间断的时间足够短,应该给人很流畅的感觉,这也就是为什么,我们能够一边听音乐,一边看这篇文章的缘故。我猜,这也是为什么运行在内存中的程序会被称为进程的缘故。

这样,我们就可以开始讨论fork函数了。假设一个进程中有一句代码p=fork()。

我们称当前调用p=fork()的进程为父进程,父进程pid号可以用getpid()获取。fork()返回一个值给变量p,此时p正常情况下应该是一个正整数,表示fork()新产生的子进程的pid号。

fork()产生的那个子进程和父进程完全相同(至少在父进程调用fork()那一瞬间是相同的),而且也是完全独立的(即执行的先后顺序完全由操作系统调度,且父进程不一定比子进程先执行完)。fork()函数并不同于一般的函数,父进程并不会等fork函数产生的子进程完全执行完再执行pid=fork()后面的代码。或者,可以理解为fork()的作用就是产生一个子进程,至于子进程是否运行、如何运行与它没关系。

现讨论子进程的执行。我们知道,既然fork()是复制父进程,那么p=fork()语句之前的情况应该是完全一致。在父进程中p变量得到的是子进程的pid号,但是在子进程中同样有这样一个p变量,它的值是不是也是子进程的pid号呢?这是关键所在! 事实上,子进程中的p变量得到的值不是子进程的pid号,而是0。子进程的pid号完全可以用getpid()在子进程中得到。这也是为什么称fork()一次调用,两次返回,即最后的结果就等价于:一个程序被调用两次形成两个进程,在p=fork()之前,两个进程完全一样,到这一句时,一个进程中p变量值为另一个进程的pid号,而另一个进程中p变量值为0,在这之后,两个进程分道扬镳,再无任何瓜葛。(注意,两个进程可以由同一个程序引起。)

fork()函数,一次调用,两次返回的更多相关文章

  1. 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03

    百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

  2. [转帖]Linux下fork函数及pthread函数的总结

    Linux下fork函数及pthread函数的总结 https://blog.csdn.net/wangdd_199326/article/details/76180514 fork Linux多进程 ...

  3. fork函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  4. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  5. UNIX环境高级编程学习笔记(十)为何 fork 函数会有两个不同的返回值【转】

    转自:http://blog.csdn.net/fool_duck/article/details/46917377 以下是基于 linux 0.11 内核的说明. 在init/main.c第138行 ...

  6. 关于fork( )函数父子进程返回值的问题

    fork()是linux的系统调用函数sys_fork()的提供给用户的接口函数,fork()函数会实现对中断int 0x80的调用过程并把调用结果返回给用户程序. fork()的函数定义是在init ...

  7. 每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行

    Linux下多少个"-"将被打印: 1 2 3 4 5 6 7 8 int main(void){   int i;   for(i=0;i<4;i++){   fork() ...

  8. python学习笔记10(函数一): 函数使用、调用、返回值

    一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明和函数定义可以出现在不同的文件中,比如C语言),但是在Python中,函数声明和函数定义是视为一体的.在Py ...

  9. 利用jQuery扩展接口为jQuery框架定义了两个自定义函数,然后调用这两个函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Tinghua Data Mining 3

    特征选择 男女身高 男女抽烟 先验分布 熵 衡量系统的不确定性 属性的价值 降低了不确定性 降低的幅度越高越好 主成分分析 旋转是的数据间的correlation消失掉 Q是正交阵 七长八短,长宽相关 ...

  2. 转 错误:ORA-28002/ORA-65162 : the password will expire within 7 days 解决方法

    今天在使用sqlplus时出现 =============================================== ERROR:ORA-28002: the password will e ...

  3. Yii2 之 UrlManager 实践 (一)

    1.  enablePrettyUrl yii2默认不支持类似 http://<domain>/site/error 的url格式,需要在config.php中启用 enablePrett ...

  4. JavaScript 事件——“事件类型”中“HTML5事件”的注意要点

    contextmenu事件 该事件用以表示何时应该显示上下文菜单,以便开发者取消默认的上下文菜单,转而提供自定义的菜单. 因为该事件属于鼠标事件,所以其事件对象中包含与光标位置有关的所有属性.如: & ...

  5. jQuery.Deferred(jQuery1.5-2.1)源码剖析

    jQuery.Deferred作为1.5的新特性出现在jQuery上,而jQuery.ajax函数也做了相应的调整.因此我们能如下的使用xhr请求调用,并实现事件处理函数晚绑定. var promis ...

  6. C语言abs函数

    C语言编程入门教程 - abs 函数是用来求整数的绝对值的. //函数名:abs //功 能:求整数的绝对值 //用 法:int abs(int i); //程序例: #include<stdi ...

  7. (转载)EventBus使用详解

    (转载)http://liuling123.com/2016/01/EventBus-explain.html 概述 EventBus是针一款对Android的发布/订阅事件总线.它可以让我们很轻松的 ...

  8. GP SQL 优化

    1.收集统计信息vacuum full analyze ZCXT.ZCOT_PS_PROJECT; 2.检查表的数据量分布select gp_segment_id,count(*) from fact ...

  9. mysql 存在更新,不存在插入

    String sql = "insert into wb_result " + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ...

  10. poj2104 K大数 划分树

    题意:给定一个数列,求一个区间的第K大数 模板题, 其中的newl, newr 有点不明白. #include <iostream> #include <algorithm> ...