2010-09-16 62 views
2

今天我們進行了一次學校鍛鍊,以創建多個過程。我們的問題不是代碼本身,也不是fork()的理解。爲什麼不fork()創建多個進程,或者它?

我和我的隊友已經是爲什麼,如下圖所示沒有創造我們的代碼4個流程的問題:

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 

//kod 

int child1(); 
int child2(); 

int main() { 

     pid_t pid1, pid2; 
     int i; 

     pid1 = fork(); 
     pid2 = fork(); 

     if(!pid1) 
       child1(); 
     else if(!pid2) 
       child2(); 
     else { 
       printf("parentlolololololol"); 
     } 

     for(;;) 

     return 0; 
} 
int child1(){ 
     for(;;) { 
       printf("A"); 
       fflush(stdout); 
       sleep(1); 
     } 
     return 0; 
} 

int child2(){ 
     for(;;){ 
       printf("B"); 
       fflush(stdout); 
       sleep(1); 
     } 
     return 0; 
} 

我們有一個切片討論程序是​​否創建4個進程與否。做第二個fork() - 調用創建一個新的子進程,爲什麼它不被任何循環阻塞,如果這種情況?或者不是第二個fork() - 調用創建一個新的子進程?

這不適合我們以任何方式運動,但我們很好奇,因爲你必須要作爲一個程序員;)

回答

1

的問題是該線路上缺少分號:

for(;;) 

    return 0; 

這意味着主程序將永遠返回0 - 實際上只在第一次有效。

第一個分支之後有兩個進程,一個是pid1是0,另一個是沒有的地方。 這兩個進程中的每一個都會調用第二個fork語句 - 其中兩個將有pid2 == 0,另外兩個不會。

 
main ---> fork --> pid1 == 0 --> fork --> pid2 == 0 
             --> pid2 != 0 
       --> pid1 != 0 --> fork --> pid2 == 0 
             --> pid2 != 0 

所以有4個過程。輸入條件,兩個被'child1'捕獲,一個被'child2'捕獲。主流程退出。這留下了3個進程運行,兩個打印'A'和一個打印'B'。

+0

哦,大聲笑,感謝您的快速回復。我們現在瞭解這個問題,並創建了3個進程,並且在父進程結束時,進程數量是確切的。 – nattefrost 2010-09-16 08:34:18

0

它確實 - 它無條件分叉兩次,創建4個進程(無論如何,3個新進程)。其中兩個應運行child1(),一個child2()和一個父代碼。這是因爲pid1/pid2對有4個不同的值,而第一個如果包含其中兩個值。

相關問題