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

舉例講解C語言的fork()函數(shù)創(chuàng)建子進程的用法

 更新時間:2016年06月22日 16:31:07   作者:nvd11  
fork函數(shù)是Linux下一個近乎專有的C語言函數(shù),因為使用時需要調(diào)用unistd.h這個頭文件,這里我們就在Linux環(huán)境下舉例講解C語言的fork()函數(shù)創(chuàng)建子進程的用法,需要的朋友可以參考下

先來看這樣一個例子,利用fork調(diào)用execlp()函數(shù)來在Linux下實現(xiàn)ps或ls命令:

#include "sys/types.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"

int main()
{
 pid_t result;
 result=fork();
 //報錯處理
 if(result==-1)
 {
  printf("Fork Error\n");
 }
 //son
 else if(result==0)
 {//調(diào)用execlp()函數(shù),相當(dāng)于"ps -ef"
 if((result=execlp("ps","ps",NULL))<0);      
    printf("son\n");
 }
 //father
    else 
 {
 if((result=execlp("ls","ls",NULL))<0);  
       printf("father\n");
 }
} 

一般來講, 我們編寫1個普通的c程序, 運行這個程序直到程序結(jié)束, 系統(tǒng)只會分配1個pid給這個程序, 也就就說, 系統(tǒng)里只會有一條關(guān)于這個程序的進程.
但是執(zhí)行了fork() 這個函數(shù)就不同了.
fork 這個英文單詞在英文里是"分叉"意思,  fork() 這個函數(shù)作用也很符合這個意思.  它的作用是復(fù)制當(dāng)前進程(包括進程在內(nèi)存里的堆棧數(shù)據(jù))為1個新的鏡像. 然后這個新的鏡像和舊的進程同時執(zhí)行下去. 相當(dāng)于本來1個進程, 遇到fork() 函數(shù)后就分叉成兩個進程同時執(zhí)行了. 而且這兩個進程是互不影響
參考下面這個小程序:

int fork_3(){ 
  printf("it's the main process step 1!!\n\n"); 
 
  fork(); 
 
  printf("step2 after fork() !!\n\n"); 
 
  int i; scanf("%d",&i);  //prevent exiting 
  return 0; 
} 

在這個函數(shù)里, 共有兩條printf語句, 但是執(zhí)行執(zhí)行時則打出了3行信息. 如下圖:

2016622162533778.png (246×100)

為什么呢, 因為fork()函數(shù)將這個程序分叉了啊,  見下面的圖解:

2016622162600978.png (796×291)

可以見到程序在fork()函數(shù)執(zhí)行時都只有1條主進程, 所以 step 1 會被打印輸出1次.
執(zhí)行 fork()函數(shù)后,  程序分叉成為了兩個進程, 1個是原來的主進程,  另1個是新的子進程, 它們都會執(zhí)行fork() 函數(shù)后面的代碼, 所以 step2 會被 兩條進程分別打印輸出各一次, 屏幕上就總共3條printf 語句了!
可以見到這個函數(shù)最后面我用了 scanf()函數(shù)來防止程序退出,  這時查看系統(tǒng)的進程, 就會發(fā)現(xiàn)兩個相同名字的進程:

2016622162622859.png (574×62)

如上圖, pid 8808 那個就是主進程了, 而 pid  8809那個就是子進程啊, 因為它的parent pid是 8808啊!
需要注意的是, 假如沒有做特殊處理, 子進程會一直存在, 即使fork_3()函數(shù)被調(diào)用完成,  子進程會和主程序一樣,返回調(diào)用fork_3() 函數(shù)的上一級函數(shù)繼續(xù)執(zhí)行, 直到整個程序退出.
可以看出, 假如fork_3() 被執(zhí)行2次,  主程序就會分叉兩次, 最終變成4個進程, 是不是有點危險. 所以上面所謂的特殊處理很重要啊!

區(qū)別分主程序和子程序
實際應(yīng)用中, 單純讓程序分叉意義不大, 我們新增一個子程序, 很可能是為了讓子進程單獨執(zhí)行一段代碼. 實現(xiàn)與主進程不同的功能.
要實現(xiàn)上面所說的功能, 實際上就是讓子進程和主進程執(zhí)行不同的代碼啊.
所以fork() 實際上有返回值, 而且在兩條進程中的返回值是不同的, 在主進程里 fork()函數(shù)會返回主進程的pid,   而在子進程里會返回0!   所以我們可以根據(jù)fork() 的返回值來判斷進程到底是哪個進程, 就可以利用if 語句來執(zhí)行不同的代碼了!
如下面這個小程序fork_1():

int fork_1(){ 
  int childpid; 
  int i; 
 
  if (fork() == 0){ 
    //child process 
    for (i=1; i<=8; i++){ 
      printf("This is child process\n"); 
    } 
  }else{ 
    //parent process 
    for(i=1; i<=8; i++){ 
      printf("This is parent process\n"); 
    } 
  } 
 
  printf("step2 after fork() !!\n\n"); 
} 

我對fork() 函數(shù)的返回值進行了判斷, 如果 返回值是0, 我就讓認為它是子進程, 否則是主程序.  那么我就可以讓這兩條進程輸出不同的信息了.
輸出信息如下圖:

2016622162641880.jpg (720×337)

可以見到 子程序和主程序分別輸出了8條不同的信息,  但是它們并不是規(guī)則交替輸出的, 因為它們兩條進程是互相平行影響的, 誰的手快就在屏幕上先輸出,  每次運行的結(jié)果都有可能不同哦.
下面是圖解:

2016622162704009.png (1024×384)

由圖解知兩條進程都對fork()返回值執(zhí)行判斷,  在if 判斷語句中分別執(zhí)行各自的代碼.  但是if判斷完成后,  還是會回各自執(zhí)行接下來的代碼. 所以 step2 還是輸出了2次.

相關(guān)文章

  • 詳解C++?左值引用與?const?關(guān)鍵字

    詳解C++?左值引用與?const?關(guān)鍵字

    這篇文章主要介紹了C++?左值引用與?const?關(guān)鍵字,左值引用是已定義的變量的別名,其主要用途是用作函數(shù)的形參,將?const?關(guān)鍵字用于左值引用時,其在初始化時可接受的賦值形式變得更加廣泛了,這里來總結(jié)一下,需要的朋友可以參考下
    2022-09-09
  • C++超詳細講解RTTI和cast運算符的使用

    C++超詳細講解RTTI和cast運算符的使用

    RTTI(Runtime Type Identification)是“運行時類型識別”的意思。C++引入這個機制是為了讓程序在運行時能根據(jù)基類的指針或引用來獲得該指針或引用所指的對象的實際類型,cast強制轉(zhuǎn)換運算符是一種特殊的運算符,它把一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型
    2022-08-08
  • C++中vector操作方式詳解(多種方式)

    C++中vector操作方式詳解(多種方式)

    這篇文章主要介紹了C++中vector操作方式詳解(多種方式),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 利用C++實現(xiàn)?然連接操作算法

    利用C++實現(xiàn)?然連接操作算法

    這篇文章主要介紹了利用C++實現(xiàn)?然連接操作算法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • C語言的指針類型詳細解析

    C語言的指針類型詳細解析

    C語言的指針類型包括兩方面的信息:一是地址,存放在指針變量中;二是類型信息,關(guān)乎于讀寫的長度,沒有存儲在指針變量中,位于用該指針讀寫時的mov指令中,不同的讀寫長度對應(yīng)的mov指令不同
    2013-09-09
  • C++中std::allocator的使用案例詳解

    C++中std::allocator的使用案例詳解

    這篇文章主要介紹了C++中std::allocator的使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++通過自定義函數(shù)求一元二次方程的根

    C++通過自定義函數(shù)求一元二次方程的根

    這篇文章主要介紹了C++通過自定義函數(shù)求一元二次方程的根,涉及C++數(shù)學(xué)運算相關(guān)技巧,非常簡單實用,需要的朋友可以參考下
    2016-05-05
  • C++:string字符串的切片方式

    C++:string字符串的切片方式

    這篇文章主要介紹了C++:string字符串的切片方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Cocos2d-x UI開發(fā)之文本類使用實例

    Cocos2d-x UI開發(fā)之文本類使用實例

    這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之文本類,文本類是UI開發(fā)中經(jīng)常使用的,本文用詳細的代碼注釋講解了文本類的使用,需要的朋友可以參考下
    2014-09-09
  • 通過GDB學(xué)習(xí)C語言的講解

    通過GDB學(xué)習(xí)C語言的講解

    今天小編就為大家分享一篇關(guān)于通過GDB學(xué)習(xí)C語言的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論

宜昌市| 阿拉善左旗| 温宿县| 太谷县| 辽中县| 天气| 金堂县| 香格里拉县| 水富县| 东乡族自治县| 平遥县| 长顺县| 内乡县| 通化县| 西安市| 阆中市| 延边| 枝江市| 靖边县| 兴安县| 丽水市| 工布江达县| 雷波县| 彩票| 东港市| 河源市| 南乐县| 隆尧县| 绍兴市| 柘荣县| 唐河县| 丹江口市| 苍南县| 绍兴市| 芜湖县| 扶沟县| 汝阳县| 景东| 灌云县| 桦甸市| 广宗县|