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

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

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

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

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

int main()
{
 pid_t result;
 result=fork();
 //報(bào)錯(cuò)處理
 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個(gè)普通的c程序, 運(yùn)行這個(gè)程序直到程序結(jié)束, 系統(tǒng)只會(huì)分配1個(gè)pid給這個(gè)程序, 也就就說, 系統(tǒng)里只會(huì)有一條關(guān)于這個(gè)程序的進(jìn)程.
但是執(zhí)行了fork() 這個(gè)函數(shù)就不同了.
fork 這個(gè)英文單詞在英文里是"分叉"意思,  fork() 這個(gè)函數(shù)作用也很符合這個(gè)意思.  它的作用是復(fù)制當(dāng)前進(jìn)程(包括進(jìn)程在內(nèi)存里的堆棧數(shù)據(jù))為1個(gè)新的鏡像. 然后這個(gè)新的鏡像和舊的進(jìn)程同時(shí)執(zhí)行下去. 相當(dāng)于本來1個(gè)進(jìn)程, 遇到fork() 函數(shù)后就分叉成兩個(gè)進(jìn)程同時(shí)執(zhí)行了. 而且這兩個(gè)進(jìn)程是互不影響
參考下面這個(gè)小程序:

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; 
} 

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

2016622162533778.png (246×100)

為什么呢, 因?yàn)閒ork()函數(shù)將這個(gè)程序分叉了啊,  見下面的圖解:

2016622162600978.png (796×291)

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

2016622162622859.png (574×62)

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

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

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

2016622162641880.jpg (720×337)

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

2016622162704009.png (1024×384)

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

相關(guān)文章

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

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

    這篇文章主要介紹了C++中std::allocator的使用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四)

    C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言實(shí)現(xiàn)合式公式的判斷示例

    C語言實(shí)現(xiàn)合式公式的判斷示例

    這篇文章主要介紹了C語言實(shí)現(xiàn)合式公式的判斷示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C/C++練習(xí)題之合并k個(gè)已排序的鏈表

    C/C++練習(xí)題之合并k個(gè)已排序的鏈表

    這篇文章主要給大家介紹了關(guān)于C/C++練習(xí)題之合并k個(gè)已排序的鏈表的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C/C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-06-06
  • C++實(shí)現(xiàn)String類的方法詳解

    C++實(shí)現(xiàn)String類的方法詳解

    在C語言中,沒有專門用來表示字符串的類型。雖然C語言為字符串提供了一系列的庫函數(shù),但這些函數(shù)與字符串這個(gè)類型是分開的。所以在C++中封裝了一個(gè)string類,來幫助我們操作字符串,本文就為大家提供了實(shí)現(xiàn)String類的方法,需要的可以參考一下
    2022-08-08
  • windows下vscode使用cmake的方法

    windows下vscode使用cmake的方法

    這篇文章主要介紹了windows下vscode使用cmake的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++模擬如何實(shí)現(xiàn)vector

    C++模擬如何實(shí)現(xiàn)vector

    這篇文章主要介紹了C++模擬如何實(shí)現(xiàn)vector問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言的分支和循環(huán)語句你了解嗎

    C語言的分支和循環(huán)語句你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語言的分支和循環(huán)語句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 淺談C++11中=delete的巧妙用法

    淺談C++11中=delete的巧妙用法

    本文主要介紹了C++11中=delete的巧妙用法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++實(shí)現(xiàn)簡單迷宮游戲

    C++實(shí)現(xiàn)簡單迷宮游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01

最新評(píng)論