2015-11-05 205 views
-1

我有一個父進程,我想從中創建4個子進程,而2個子進程每個都有一個子進程。父進程有多個子進程和2個子進程有一個子進程

我能夠從父級創建4個子進程。但是當我嘗試創建2子進程的子進程時,我有一個無限循環。 我用循環來創建4個進程並添加了一個條件,即創建第二個子進程和第四個子進程時,爲每個進程創建一個子進程。

  • 家長有(child1 chil2 child3孩子4)
  • CHILD2有(孩子5 child6)

來源:

#include <stdio.h> 
#include <unistd.h> 
#include <sched.h> 
#include <sys/time.h> 
#include <sys/resource.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    for(i = 0; i <= 3; i++) 
    { 
     if(fork() == 0) 
     { 
      printf("process %d and his parent is %d \n", 
       getpid(), getppid()); 

      if(i = 1) 
      { 
       if(fork() == 0) 
       { 
        printf("process %d and his parent is %d \n", 
         getpid(), getppid()); 
        break; 
       } 
      } 
     } 
    } 

    return 0; 
} 
+5

發佈最小代碼。無法看到你做錯了,否則。 –

+0

的#include 的#include 的#include 的#include #包括在 INT主(INT的argc,焦炭** argv的) { INT I;對於(i = 0; i <= 3; i ++) if(fork()== 0) printf(「process%d and their parent is%d \ n」,getpid(),getppid ()); \t \t如果(I = 1){ \t \t \t如果(叉()== 0){ \t \t \t的printf( 「進程%d和他的父母是%d \ n」 個,GETPID(),getppid( )); \t \t \t \t break; \t \t \t} \t \t \t} } } 返回0; } – Kazaloco

+0

系統正常工作!現在您已經發布了兩個重新投票的代碼。在評論中不低於:) –

回答

0

兩個問題。第一:

if(i = 1) 

您使用=這是一個分配的,而不是==其中比較平等。實際上這裏發生的是i被賦值爲1,並且該值(1)正在布爾上下文中進行評估,該值始終爲true。因此,每個孩子都會輸入if塊,然後分出自己的孩子。

使用對比操盤手,同時檢查是否i是1或3,如果你想在第二個和第四個孩子也fork

if ((i == 1) || (i == 3)) 

其次,在if(fork()==0)塊結束時,子進程繼續執行for循環的下一次迭代。所以每個孩子都會調用循環和分叉的父親行爲。這導致創建的流程比預期更多。

您需要在該塊的末尾添加一條exit語句。此外,一定要#include <stdlib.h>exit定義:

if (fork()==0) 
{ 
    ... 
    exit(0); 
} 

,將是有益的一兩件事:在循環結束時,有家長wait爲所有兒童完成。否則,可能會exit前的孩子,孩子們將報告過程'作爲父

這些修訂後因此,代碼如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sched.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/time.h> 
#include <sys/resource.h> 

int main(int argc, char **argv) 
{ 
    int i; 
    for(i = 0; i <= 3; i++) 
    { 
     if(fork() == 0) 
     { 
      printf("process %d and his parent is %d \n", 
       getpid(), getppid()); 

      if ((i == 1) || (i == 3)) 
      { 
       if(fork() == 0) 
       { 
        printf("process %d and his parent is %d \n", 
         getpid(), getppid()); 
        exit(0); 
       } 
       while (wait(NULL) != -1); 
      } 
      exit(0); 
     } 
    } 
    while (wait(NULL) != -1); 

    return 0; 
} 
0

你比較分配值1 i代替。

if(i = 1) 

應該是

if(i == 1) 

如果意欲進行測試以循環控制變量的i和值1勘定平等創建一個無限循環時i總是被設置爲值1。

然而,根據你的描述,你想要爲4個初始子進程的第二個和第四個創建一個子進程,這還沒有完成你所要做的。

鑑於4名原始兒童的約束,可以編寫

if((i & 1) != 0) 

計算結果爲true對於其中的i的二進制表示的最低位被設置值1和3。