簡略控制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()以後父子過程的履行次序是不肯定的。