天天看點

關于fork()函數的一點思考關于fork()函數的一點思考

關于fork()函數的一點思考

最近看作業系統的程序部分,對fork()函數的有些疑惑,于是查書本,看部落格,花了一晚上時間研究了一下fork()的執行過程,終于有了一些收獲。 fork()對初學者來說還是比較容易混淆的,特别是當多個fork連着用時。要想弄清楚fork的執行過程,首先要明白fork的重要特性。 fork()是一個建立程序的函數,新建立的子程序相當于父程序的一份拷貝,之前的各種變量都是與父程序相同的;fork()被父程序調用一次傳回兩次,一次是在父程序中傳回子程序的PID,另一次是在子程序中自己給自己傳回0;還有一個很重要特性是父程序與子程序是同時運作的,一旦子程序被建立,他們的運作不存在先後順序,因為作業系統會根據程序排程算法來交替執行各種程序;是以可以不用在意執行結果的先後順序。 了解了上面三點,就可以找到看懂fork()程式的方法了。畫程序圖是一個很好的方法,子程序所執行的操作基本和建立它父程序所執行的操作一樣,隻是子程序傳回0改自己罷了,是以程序圖有點像數學中的分形,每執行一次fork,就相當于在父程序和子程序都分形一次。畫圖時可以把父程序先畫出,再在子程序複制一份,具體程序圖分形可參考CSAPP的P494頁。 程式執行個體:參考:點選打開連結

<span style="font-size:18px;">#include "stdio.h"
#include "sys/types.h"
#include "unistd.h"
 
int main()
{
    pid_t pid1;
    pid_t pid2;
 
    pid1 = fork();
    pid2 = fork();
 
    printf("pid1:%d, pid2:%d\n", pid1, pid2);
}</span>
           

參考:點選打開連結

/* 
 *  fork_test.c 
 *  version 3 
 *  Created on: 2010-5-29 
 *      Author: wangth 
 */  
#include <unistd.h>  
#include <stdio.h>  
int main(void)  
{  
   int i=0;  
   for(i=0;i<3;i++){  
       pid_t fpid=fork();  
       if(fpid==0)  
           printf("son/n");  
       else  
           printf("father/n");  
   }  
   return 0;  
  
}  
           

程序圖:

關于fork()函數的一點思考關于fork()函數的一點思考

繼續閱讀