1、fork入門
計算機程序設計中的分叉函數。返回值: 若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程標記;否則,出錯返回-1。
fork函數將運行着的程序分成2個(幾乎)完全一樣的進程,每個進程都啟動一個從代碼的同一位置開始執行的線程。這兩個進程中的線程繼續執行,就像是兩個用戶同時啟動了
該應用程序的兩個副本。
需要注意的是:(1)當調用fork()函數時,在該位置進程一分為二,一個是父進程,一個是子進程。(2)若調用成功返回的是兩個值,父進程返回的值為子進程標志,子進程返回的值為0,不成功返回為-1。
為什么成功調用會返回兩個值?由於在復制時復制了父進程的堆棧段,所以兩個進程都停留在fork函數中,等待返回。因此fork函數會返回兩次,一次是在父進程中返回,另一次是在子進程中返回,這兩次的返回值是不一樣的。
每個進程都有一個獨特(互不相同)的進程標識符(process ID),可以通過getpid()函數獲得,還有一個記錄父進程pid的變量,可以通過getppid()函數獲得變量的值。
子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味着父子進程間不共享這些存儲空間。下面看一個簡單的例子:

1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 pid_t pid = fork(); 8 if(pid < 0) 9 printf("error"); 10 else if(pid == 0) 11 printf("this is child\n"); 12 else 13 printf("this is parent\n"); 14 return 0; 15 }
輸出:this is parent
this is child
至於父進程和子進程哪個先執行,這和操作系統和調度算法有關,其實這個問題在實際應用中並不重要。
2、fork進階
看一下一個例子。

1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 int i = 0; 8 for(i = 0; i < 3; i++) 9 { 10 fork(); 11 printf("hello world\n"); 12 } 13 return 0; 14 }
運行的時候一共輸出14個hello world。
當i = 0的時候,一共2個進程,輸出2個hello world, 當i=1時,2個進程變成4個,這時輸出4個hello world,當i=2時,4個進程變成8個,這時輸出8個hello world,一共輸出2+4+8=14個hello world。當循環n次時,就輸出2(1 + 2 + 2n-1)個。