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

簡略控制Linux體系中fork()函數創立子過程的用法

編輯:關於C++

簡略控制Linux體系中fork()函數創立子過程的用法。本站提示廣大學習愛好者:(簡略控制Linux體系中fork()函數創立子過程的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略控制Linux體系中fork()函數創立子過程的用法正文


fork()函數用於從已存在的過程中創立一個新過程。新過程稱為子過程,而園過程稱為父過程。應用fork()函數獲得的子過程是父過程的一個復成品,它從父過程處繼續了全部過程的地址空間,包含過程的高低文、代碼段、過程客棧、內存信息、翻開的文件描寫符、符號掌握設定、過程優先級、過程組號、以後任務目次、根目次、資本限制和掌握終端等,而子過程所獨有的只要它的過程號、資本應用和計時器等。

由於子過程簡直是父過程的完整復制,所以父子兩過程會運轉統一個法式。這就須要用一種方法來辨別它們,並使它們照此運轉,不然,這兩個過程弗成能做分歧的事。現實上是在父過程中履行fork()函數時,父過程會復制一個子過程,並且父子過程的代碼從fork()函數的前往開端分離在兩個地址空間中同時運轉,從而使兩個過程分離取得所屬fork()函數的前往值,個中在父過程中的前往值是子過程的過程號,而在子過程中前往0。是以,可以經由過程前往值來斷定該過程的父過程照樣子過程。

同時可以看出,應用fork()函數的價值是很年夜的,它復制了父過程中的代碼段、數據段和客棧段裡的年夜部門內容,使得fork()函數的體系開支比擬年夜,並且履行速度也不是很快。

代碼示例:

#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());
  }
}

打印的成果以下:

pid: 552
father pid: 549
child pid: 552

以下是一些留意點及總結:
1) 之前在VS上想要用,成果發明基本沒有這個頭文件;由於<unistd.h>是類unix體系才有的;下面的代碼在mac os上測試OK。

2) fork()是用來創立子過程的,創立以後子過程是父過程的正本,子過程取得父過程的數據空間、堆和棧的正本,留意二者其實不是同享的。父子二者僅同享代碼段。這個是之前的完成,如今的話普通不會直接去復制,而是寫時復制(copy-on-write)。

3) fork()以後父子過程的履行次序是不肯定的。

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