最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進程的用法

 更新時間:2016年06月08日 15:05:30   作者:Worker  
fork()函數(shù)只能在類Unix系統(tǒng)下使用,因為需要引入unistd頭文件,這里我們就來簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進程的用法,需要的朋友可以參考下

fork()函數(shù)用于從已存在的進程中創(chuàng)建一個新進程。新進程稱為子進程,而園進程稱為父進程。使用fork()函數(shù)得到的子進程是父進程的一個復(fù)制品,它從父進程處繼承了整個進程的地址空間,包括進程的上下文、代碼段、進程堆棧、內(nèi)存信息、打開的文件描述符、符號控制設(shè)定、進程優(yōu)先級、進程組號、當(dāng)前工作目錄、根目錄、資源限制和控制終端等,而子進程所獨有的只有它的進程號、資源使用和計時器等。

因為子進程幾乎是父進程的完全復(fù)制,所以父子兩進程會運行同一個程序。這就需要用一種方式來區(qū)分它們,并使它們照此運行,否則,這兩個進程不可能做不同的事。實際上是在父進程中執(zhí)行fork()函數(shù)時,父進程會復(fù)制一個子進程,而且父子進程的代碼從fork()函數(shù)的返回開始分別在兩個地址空間中同時運行,從而使兩個進程分別獲得所屬fork()函數(shù)的返回值,其中在父進程中的返回值是子進程的進程號,而在子進程中返回0。因此,可以通過返回值來判斷該進程的父進程還是子進程。

同時可以看出,使用fork()函數(shù)的代價是很大的,它復(fù)制了父進程中的代碼段、數(shù)據(jù)段和堆棧段里的大部分內(nèi)容,使得fork()函數(shù)的系統(tǒng)開銷比較大,而且執(zhí)行速度也不是很快。

代碼示例:

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char * argv[]) {
  // insert code here...
  pid_t pid;
  if((pid = fork()) == 0){
    //返回0的是子進程
    printf("child pid: %d\n", getpid());
  } else {
    printf("pid: %d\n", pid);//父進程中返回子進程的pid
    printf("father pid: %d\n", getpid());
  }
}

打印的結(jié)果如下:

pid: 552
father pid: 549
child pid: 552

以下是一些注意點及總結(jié):
1) 之前在VS上想要用,結(jié)果發(fā)現(xiàn)根本沒有這個頭文件;因為<unistd.h>是類unix系統(tǒng)才有的;上面的代碼在mac os上測試OK。

2) fork()是用來創(chuàng)建子進程的,創(chuàng)建之后子進程是父進程的副本,子進程獲得父進程的數(shù)據(jù)空間、堆和棧的副本,注意兩者并不是共享的。父子兩者僅共享代碼段。這個是以前的實現(xiàn),現(xiàn)在的話一般不會直接去復(fù)制,而是寫時復(fù)制(copy-on-write)。

3) fork()之后父子進程的執(zhí)行順序是不確定的。

相關(guān)文章

最新評論

临洮县| 正定县| 平和县| 南皮县| 亚东县| SHOW| 邯郸市| 芮城县| 灌南县| 石狮市| 芜湖县| 湖南省| 绵阳市| 沾化县| 新泰市| 安国市| 巴林左旗| 祁东县| 老河口市| 四会市| 昭通市| 松潘县| 山阳县| 河池市| 梓潼县| 剑川县| 二连浩特市| 中阳县| 长乐市| 铜山县| 昔阳县| 江门市| 滦南县| 广饶县| 民勤县| 黔南| 永嘉县| 屏南县| 尉犁县| 眉山市| 夏邑县|