2012-02-19 44 views
1

我有這個過程圖,我必須做代碼源! 請檢查其正確Fork的代碼源代碼(),圖表過程

enter image description here

的是我的

一)

  #include <unistd.h> 
      int main(void) { 
      int i; 
      for (i= 0; i < 3; i++) 
      { 
      if(!fork()) 
      break; 
         } 

     while(wait(NULL) !==-1);//to avoid the appearance of zombies processes?? 

第二溶液B)解決方案:

  #include <unistd.h> 
      int main(void) { 
      int i,pid; 
      for(i=0; i<3;i++) 
      { 
       pid=fork(); 
      if (pid>0) 
       break; 
         } 
      while(wait(NULL)!=-1); 

PS:另外我必須包括評論以表明我在哪裏必須包括將運行每個孩子的「」exec「」!

+0

爲什麼這麼多「!」和「?」?鍵盤有問題嗎? – cnicutar 2012-02-19 21:44:51

+0

他們都是錯的。在這兩個版本中,子進程都會調用wait(),這不是你想要的。 – wildplasser 2012-02-19 21:45:58

回答

2

在這兩個程序中,您都需要合理化縮進,並在末尾包含缺失的大括號。

解決方案(a)或多或少是正確的。我們可以選擇wait()waitpid(),並且您應該使用#include <sys/wait.h>來聲明您使用的等待功能。你沒有顯示你會在哪裏做exec(),這意味着我們不能說你是否會遇到等待零孩子的子進程問題 - 這是不明智的,但不會影響正確性。 (就我個人而言,我會寫if (fork() == 0),因爲我認爲它比!fork()更清晰,尤其是因爲返回值0意味着成功分叉的過程,而!fork()讀取的是「不分叉」,這可能更容易意味着「沒有分叉」

解決方案(b)也或多或少是正確的,除了exec()的位置將不同,並且如果fork()失敗,您將執行循環比您應該的時間更長一點,但它又不可能是主要的問題,主要問題是'一個過程如何判斷它是原始過程還是其中一個孩子'?你沒有顯示出區分原始過程和不同孩子所需的控制信息,如果你有管道設置或任何東西,這是不顯示。