fork函數的作用
一個進程,包括代碼、數據和分配給進程的資源。fork()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個進程也可以做不同的事。
一個進程調用fork()函數后,系統先給新的進程分配資源,例如存儲數據和代碼的空間。然后把原來的進程的所有值都復制到新的新進程中,只有少數值與原來的進程的值不同。相當於克隆了一個自己。
fork出錯可能有兩種原因:
1)當前的進程數已經達到了系統規定的上限,這時errno的值被設置為EAGAIN。
2)系統內存不足,這時errno的值被設置為ENOMEM。
創建新進程成功后,系統中出現兩個基本完全相同的進程,這兩個進程執行沒有固定的先后順序,哪個進程先執行要看系統的進程調度策略。
root@localhost:~# vi fork_test.c
#include <unistd.h> #include <stdio.h> int main() { pid_t fpid; int count = 0 ; printf("start \n"); fpid = fork(); printf("fork \n"); if(fpid<0) { printf("error in fork! \n"); } else if (fpid==0) { printf("child process %d \n",getpid()); count ++; } else { printf("parent process %d \n",getpid()); count ++; } printf("統計結果是:%d \n",count); return 0 ; }
root@localhost:~# gcc fork_test.c -o fork_test root@localhost:~# ./fork_test
輸出結果如下:
start fork parent process 1579 統計結果是:1 root@localhost:~# fork child process 1580 統計結果是:1
總結: fork函數 會創建一個新進程,pid為0時是子進程 ,pid 不為零時是父進程。
子進程執行是從fork開始執行的。fork之前的,不用再次執行。
參考文檔:http://www.cnblogs.com/jeakon/archive/2012/05/26/2816828.html