2013-01-15 30 views
1

這是我更新的代碼段fork調用不執行代碼孩子

for (int i=0; i<30; i++){ 

     printf("Forking\n"); 

     tmpPid = fork(); 

     switch(tmpPid) 

     { 
     case -1: 

      printf("Error"); 
      break; 
     case 0: 

      printf("Fork success for proc %d\n", i); 
      //call some function 
      _exit(0) 
      break; 

     default: 

     printf("Fork succeed"); 
     //store the pid in a vector 
      break; 
    } 
} 

//iterate through the vector and wait on each process. 
// waitpid(vectorList[i], &exitStatus, WNOHANG) 

分叉的幾乎15-18子進程正常工作。但是對於某些進程,子代碼根本不被執行,子進程只是掛起。 (我,E叉()只返回子ID,但不是零)。 如果我通過調用其他虛擬函數在for循環中購買更多時間,則不會看到此問題。 誰能告訴我最新的問題?是否有必要延遲多叉?

謝謝

+4

該錯誤代碼未顯示,很可能是您在'case 0'中調用的函數(例如,如果它不調用'_exit',那可能是您的問題)。給我們一個完整的,可編譯的,自包含的例子來證明問題。 –

+0

如果'some function'中的代碼返回,那麼這不是一個[fork bomb](http://en.wikipedia.org/wiki/Fork_bomb)? – unwind

+0

我忘了在這裏提到_exit(0)。它在我的實際代碼中。仍然有1或2個進程沒有命中子代碼,但父進程被執行。 –

回答

0

某些子進程在父代死亡之前可能沒有時間打印。

在結束父進程之前,您需要爲子進程wait

也可能有幾個子進程同時寫入同一個輸出流的問題。 (任何人都可以驗證這是一個潛在的問題嗎?)

+0

但是,在childs部分,我正在調用一個沒有被執行的函數。 (正如我所提到的,對於所有的子進程都沒有看到這種行爲,只有1或2個進程掛起) –

+0

在這種情況下,它將取決於函數在做什麼。對fork()可以被調用的頻率沒有限制。 –

1

我不確定該程序做它最初打算做什麼。

基本上具有N == 30從端

for (i=0 ; i<N ; i++) { 
     print("Forking\n"); 
     fork(); 
    } 

推理。

  • 對我== 29:在孩子結束循環和模具
  • 對我== 28:在仍然做和這樣做的孩子 ...

等等

而不是顯示30「分岔」,將會有2^0+2^1+2^2+...+2^29「分岔」。

I.e. 2^N-12^30 - 11,073,741,823叉。

根據您的操作系統,系統可能會抱怨並掛起ulimit/system/window/user/shell限制。

也許

for (i=0 ; i<N ; i++) { 
     print("Forking\n"); 
     if (fork()) exit(0); 
    } 

或片段具有default:exit(0);使得孩子模具(可怕的話)將提供預期的結果。

1

如果父進程被殺死,那麼子進程也會被殺死。所以我們需要通知父母程序等到孩子完成工作。在您的程序中使用waitwaitpid

wait將阻止調用進程,直到其任何一個子進程終止。

waitpid將阻止調用進程,直到第一個填寫中提到的子進程終止。

+0

是的。我在for循環之後做了waitpid。 –