2013-09-22 61 views
1

我希望這個方案從0打印1〜5,但只打印一個迭代循環。但是,如果我註釋掉父級的for循環,則會打印出預期的結果......會導致這種情況的原因是什麼?爲空叉導致怪異的行爲

int main(){ 
    int pid; 
    int i=0; 
    for(i=0;i<5;i++){ 
     printf("i: %d\n",i); 
     pid = fork(); 
     if(pid < 0){ 
      printf("Error forking\n"); 
     } else if(pid == 0){ 
      //child 
      for(i=0;i<10;i++); 
      exit(1); 
     } else { 
      //parent 
      for(i=0;i<10;i++); 
      //exit(1); 
     } 
    } 
} 
+0

'爲(I = 0; I <5; i ++在){'要更改i。在子迴路。也許發明另一個變量名? – wildplasser

回答

3

你總是在訪問您的for -loops相同的變量i,尤其是在「內部」的:

for(i=0;i<10;i++); 

改變他們這樣的事情有獨立循環:

int j; 
for(j=0;j<10;j++); 

那麼爲什麼它只執行一次迭代呢?由於i在相應的內部循環之後具有值10(在兩個過程中),所以外部循環i < 5的條件當然將評估爲false

+0

哇,我笨...這是當你的代碼,而休息 –

+0

我們都在那裏整天發生的事情;)很樂意幫忙! – olydis

1

父母和子女有流程設置1〜10個,因爲空循環。所以,當下一個「outter」迭代即將發生時,我是10,所以循環條件不成立。

1

我建議以下更改程序:

int main(void) 
{ 
    for(int i=0;i<5;i++) { 
    printf("i: %d\n",i); 

    pid_t pid = fork(); 
    if(pid < 0) { 
     perror("Error forking\n"); 
    } else if(pid == 0) { 
     //child 
     for(int j=0;j<10;j++) { 
     ; 
     } 
     exit(EXIT_FAILURE); 
    } else { 
     //parent 
     for(int j=0;j<10;j++) { 
     ; 
     } 
     exit(EXIT_FAILURE); 
    } 
    } 
}