2013-09-23 37 views
0

我有下面的代碼,我試圖通過分叉創建子流程。我想要完成3個子過程。然而,當我運行代碼時,我似乎越來越多,可能是因爲子進程分叉孫子。我在這裏錯過了什麼,我該如何防止這一點。防止大孩子在C中分叉

代碼:

for(j = 0; j < 3 ; j++){ 
    if((pid = fork()) == 0){   // child process 
     dosomething(); 
     exit(0);    // terminate child process 
    } 
    else if((pid = fork()) > 0){ 
     printf("I'm in parent of the client spawn loop\n"); 
//  exit(0);  
    } 
} 

輸出:

I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
I'm in parent of the client spawn loop 
+3

您正在調用fork兩次。 –

+0

是啊,明白了!這對我來說是一種粗心大意!複製粘貼總案例 –

回答

5

不要做第二個fork調用,因爲它會創建一個新的孩子。第一個是不夠的:

for (j = 0; j < 3; ++j) 
{ 
    pid_t pid = fork(); 
    if (pid == 0) 
    { 
     printf("In child (j = %d)\n", j); 
     exit(0); 
    } 
    else if (pid > 0) 
    { 
     printf("In parent (j = %d)\n", j); 
    } 
} 

將打印"In child"三次,j等於012。父母打印相同。

在你的真實代碼中,你應該檢查錯誤。

+0

哦,它是我的不好的! –

1

不要叫比一次循環fork()更多。

父母不應該再次打電話fork(),這將創建另一個孩子並引入另一個孩子 - 父母分離點。

你應該有,在循環:

const int pid = fork(); 
if(pid == 0) 
{ 
    doSomething(); 
    exit(); 
}