一、fork入門算法
計算機程序設計中的分叉函數。返回值: 若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程標記;不然,出錯返回-1。ide
fork函數將運行着的程序分紅2個(幾乎)徹底同樣的進程,每一個進程都啓動一個從代碼的同一位置開始執行的線程。這兩個進程中的線程繼續執行,就像是兩個用戶同時啓動了函數
該應用程序的兩個副本。this
須要注意的是:(1)當調用fork()函數時,在該位置進程一分爲二,一個是父進程,一個是子進程。(2)若調用成功返回的是兩個值,父進程返回的值爲子進程標誌,子進程返回的值爲0,不成功返回爲-1。spa
爲何成功調用會返回兩個值?因爲在複製時複製了父進程的堆棧段,因此兩個進程都停留在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 parentcode
this is childblog
至於父進程和子進程哪一個先執行,這和操做系統和調度算法有關,其實這個問題在實際應用中並不重要。
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)個。