linux中fork()函數詳解


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

  輸出: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 }
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)個。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM