linux中fork()函數詳解

 一、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 }
View Code

  輸出: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 }
View Code

   運行的時候一共輸出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)個。

相關文章
相關標籤/搜索