1. 程式人生 > >進程創建函數fork

進程創建函數fork

修改 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