欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年06月08日 15:05:30   作者:Worker  
fork()函數(shù)只能在類Unix系統(tǒng)下使用,因?yàn)樾枰雞nistd頭文件,這里我們就來(lái)簡(jiǎn)單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進(jìn)程的用法,需要的朋友可以參考下

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

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

同時(shí)可以看出,使用fork()函數(shù)的代價(jià)是很大的,它復(fù)制了父進(jìn)程中的代碼段、數(shù)據(jù)段和堆棧段里的大部分內(nèi)容,使得fork()函數(shù)的系統(tǒng)開(kāi)銷比較大,而且執(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的是子進(jìn)程
    printf("child pid: %d\n", getpid());
  } else {
    printf("pid: %d\n", pid);//父進(jìn)程中返回子進(jìn)程的pid
    printf("father pid: %d\n", getpid());
  }
}

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

pid: 552
father pid: 549
child pid: 552

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

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

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

相關(guān)文章

  • VS及Unity安裝和使用Nuget包

    VS及Unity安裝和使用Nuget包

    本文主要介紹了VS及Unity安裝和使用Nuget包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • c語(yǔ)言實(shí)現(xiàn)數(shù)組循環(huán)左移m位

    c語(yǔ)言實(shí)現(xiàn)數(shù)組循環(huán)左移m位

    這篇文章主要介紹了c語(yǔ)言實(shí)現(xiàn)數(shù)組循環(huán)左移m位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++構(gòu)造析構(gòu)賦值運(yùn)算函數(shù)應(yīng)用詳解

    C++構(gòu)造析構(gòu)賦值運(yùn)算函數(shù)應(yīng)用詳解

    構(gòu)造函數(shù)主要作用在于創(chuàng)建對(duì)象時(shí)為對(duì)象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無(wú)須手動(dòng)調(diào)用;析構(gòu)函數(shù)主要作用在于對(duì)象銷毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一 些清理工作
    2022-09-09
  • 構(gòu)建mfc窗體的簡(jiǎn)單示例

    構(gòu)建mfc窗體的簡(jiǎn)單示例

    這篇文章主要介紹了構(gòu)建mfc窗體的簡(jiǎn)單示例,需要的朋友可以參考下
    2014-04-04
  • C++詳解Primer文本查詢程序的實(shí)現(xiàn)

    C++詳解Primer文本查詢程序的實(shí)現(xiàn)

    這個(gè)程序還是比較復(fù)雜的,把這句話作為文章的開(kāi)頭可以看出它的真實(shí)性.....這篇文章主要介紹了文本查詢程序的實(shí)現(xiàn),下面我們一起來(lái)看看
    2022-06-06
  • C/C++新建注冊(cè)表項(xiàng)的代碼示例

    C/C++新建注冊(cè)表項(xiàng)的代碼示例

    今天小編就為大家分享一篇關(guān)于C/C++新建注冊(cè)表項(xiàng)的代碼示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C/C++中extern函數(shù)使用詳解

    C/C++中extern函數(shù)使用詳解

    extern可以置于變量或者函數(shù)前,以標(biāo)示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。此外extern也可用來(lái)進(jìn)行鏈接指定
    2022-09-09
  • 詳解C++中賦值和輸入輸出語(yǔ)句的用法

    詳解C++中賦值和輸入輸出語(yǔ)句的用法

    這篇文章主要介紹了詳解C++中賦值和輸入輸出語(yǔ)句的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++實(shí)現(xiàn)對(duì)輸入數(shù)字組進(jìn)行排序

    C++實(shí)現(xiàn)對(duì)輸入數(shù)字組進(jìn)行排序

    這里給大家介紹的是通過(guò)某個(gè)方法實(shí)現(xiàn)判斷命令行中輸入的數(shù)字是幾個(gè),這樣再用冒泡法排序的時(shí)候就不用擔(dān)心輸入的是幾個(gè)數(shù)字,用到的知識(shí)主要是冒泡法排序
    2015-11-11
  • C++實(shí)現(xiàn)LeetCode(147.鏈表插入排序)

    C++實(shí)現(xiàn)LeetCode(147.鏈表插入排序)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(147.鏈表插入排序),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論