程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 舉例講授C說話的fork()函數創立子過程的用法

舉例講授C說話的fork()函數創立子過程的用法

編輯:關於C++

舉例講授C說話的fork()函數創立子過程的用法。本站提示廣大學習愛好者:(舉例講授C說話的fork()函數創立子過程的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例講授C說話的fork()函數創立子過程的用法正文


先來看如許一個例子,應用fork挪用execlp()函數來在Linux下完成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)
 {//挪用execlp()函數,相當於"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法式, 運轉這個法式直到法式停止, 體系只會分派1個pid給這個法式, 也就就說, 體系裡只會有一條關於這個法式的過程.
然則履行了fork() 這個函數就分歧了.
fork 這個英文單詞在英文裡是"分叉"意思,  fork() 這個函數感化也很相符這個意思.  它的感化是復制以後過程(包含過程在內存裡的客棧數據)為1個新的鏡像. 然後這個新的鏡像和舊的過程同時履行下去. 相當於原來1個過程, 碰到fork() 函數後就分叉成兩個過程同時履行了. 並且這兩個過程是互不影響
參考上面這個小法式:

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

在這個函數裡, 共有兩條printf語句, 然則履行履行時則打出了3行信息. 以下圖:

為何呢, 由於fork()函數將這個法式分叉了啊,  見上面的圖解:

可以見到法式在fork()函數履行時都只要1條主過程, 所以 step 1 會被打印輸入1次.
履行 fork()函數後,  法式分叉成了兩個過程, 1個是本來的主過程,  另1個是新的子過程, 它們都邑履行fork() 函數前面的代碼, 所以 step2 會被 兩條過程分離打印輸入各一次, 屏幕上就總共3條printf 語句了!
可以見到這個函數最初面我用了 scanf()函數來避免法式加入,  這時候檢查體系的過程, 就會發明兩個雷同名字的過程:

如上圖, pid 8808 誰人就是主過程了, 而 pid  8809誰人就是子過程啊, 由於它的parent pid是 8808啊!
須要留意的是, 假設沒有做特別處置, 子過程會一向存在, 即便fork_3()函數被挪用完成,  子過程會和主法式一樣,前往挪用fork_3() 函數的上一級函數持續履行, 直到全部法式加入.
可以看出, 假設fork_3() 被履行2次,  主法式就會分叉兩次, 終究釀成4個過程, 是否是有點風險. 所以下面所謂的特別處置很主要啊!

差別分主法式和子法式
現實運用中, 純真讓法式分叉意義不年夜, 我們新增一個子法式, 極可能是為了讓子過程零丁履行一段代碼. 完成與主過程分歧的功效.
要完成下面所說的功效, 現實上就是讓子過程和主過程履行分歧的代碼啊.
所以fork() 現實上有前往值, 並且在兩條過程中的前往值是分歧的, 在主過程裡 fork()函數會前往主過程的pid,   而在子過程裡會前往0!   所以我們可以依據fork() 的前往值來斷定過程究竟是哪一個過程, 便可以應用if 語句來履行分歧的代碼了!
以下面這個小法式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() 函數的前往值停止了斷定, 假如 前往值是0, 我就讓以為它是子過程, 不然是主法式.  那末我便可以讓這兩條過程輸入分歧的信息了.
輸入信息以下圖:

可以見到 子法式和主法式分離輸入了8條分歧的信息,  然則它們其實不是規矩瓜代輸入的, 由於它們兩條過程是相互平行影響的, 誰的手快就在屏幕上先輸入,  每次運轉的成果都有能夠分歧哦.
上面是圖解:

由圖解知兩條過程都對fork()前往值履行斷定,  在if 斷定語句平分別履行各自的代碼.  然則if斷定完成後,  照樣會回各自履行接上去的代碼. 所以 step2 照樣輸入了2次.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved