fork()函数,一次调用,两次返回

参考自: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,在这以后,两个进程分道扬镳,再无任何瓜葛。(注意,两个进程能够由同一个程序引发。)函数

相关文章
相关标签/搜索