進程創建函數fork
阿新 • • 發佈:2018-07-24
修改 wid etc pan tpi 網絡請求 tool pid 一次 fork
fork()
調用一次返回兩次:父進程返回子進程pid,子進程返回0。
進程是樹形結構,子進程可隨時通過getppid()獲取父進程;
而父進程只能在創建時獲取子進程號。
子進程使用父進程堆棧及數據空間副本等存儲空間。代碼正文段及文件共享,例如文件偏移量。
存儲空間多采用寫時復制的方式Copy-On-Write。一開始共享存儲空間,直到子進程試圖修改某個區域時,進行復制。復制單位一般為頁大小。
常見用法:
1、父進程希望子進程復制自己,後處理不同的代碼段。如網絡請求,父進程等待請求,後續操作交給子進程;
2、父進程需要執行另一個不同的程序。一般交給子進程,fork()後exec()。如shell操作。
例子:
#include <unistd.h> #include <stdio.h> #include <sys/types.h> int main() { int money = 100; pid_t kid = fork(); if(kid < 0) { printf("wrong!"); }else if (kid == 0) { printf("I'm kid! pid=[%d]\n", getpid()); money += 10; }else { printf("I'm parent! pid=[%d] \n", getpid()); money -= 10; } printf("pid=[%d], ppid=[%d], money=[%d] \n", getpid(), getppid(), money); getchar(); return 0; }
運行結果:
I'm parent! pid=[3282] pid=[3282], ppid=[3139], money=[90] I'm kid! pid=[3283] pid=[3283], ppid=[3282], money=[110]
進程創建函數fork