2012-10-02 184 views
0

我創建了三個進程,我想同步他們的工作。具體來說,我希望第一個進程等待第二個,第二個等待第三個。基本上按照它們創建的相反順序執行它們。子進程彼此等待

這是我到目前爲止所做的。

for (; i < 3 ; i++){ 
     pids[i] = fork(); 
     if (pids[i] == 0) 
      break; 
} 
if (pids[i] != 0){ 
    wait(); // Main thread has to wait..  
} 
else{    
    if (i == 0){ 
     waitpid(pids[1], &status, 0);  
     printProcessInfo(0);   
    } 
    else if (i == 1){ 
     waitpid(pids[2], &status, 0);  
     printProcessInfo(1);   
      } 
    else if (i == 2){ 
     printProcessInfo(2);   
    }    
} 

我使用我檢查我在哪個孩子的過程,因爲我假設我得到正確的我在孩子的過程,所以若i = 0,我是事實上的拳頭孩子。這個假設是真的嗎?無論如何,我沒有得到我想要的訂單,實際上這些流程是按照自然順序執行的,繞過了我放置的waitpid調用。有任何想法嗎?

+0

你必須這樣做嗎?如果每個孩子都創造一個孩子,這會容易得多。正如你目前所看到的,沒有一個孩子會知道年輕的兄弟姐妹,只是年齡較大的兄弟姐妹。 IOW,當父級創建child1時,child1是它自己的進程。該進程的pid表不會被更新以反映更多的孩子。只有父母的pid表具有所有信息。您的waitpid()調用可能在ECHILD上失敗(您沒有檢查),這就是爲什麼它看起來沒有被執行。 – Duck

+0

我想通了。這是一個非常混亂的學校任務,因爲教授特別要求我們不要讓第一個叉子等第二個,所以我很困惑。我想我會研究一些其他形式的IPC,即使我們還沒有在這個章節中討論過,也是如此。謝謝。 –

回答

0

不,你正在獲得更多的3過程。

考慮一個簡化版本(這只是刪除等待...你做相同數量的叉):

for (i=0; i < 3 ; i++){ 
    pids[i] = fork(); 
} 

因爲你做的叉裏面一個for循環,無需檢查返回值。父母和孩子都會得到自己的孩子。

[###############PARENT###############] 
      |   |   | 
     i=0   i=1   i=2 
      |   |   | 
     [ a0 ]  [ b0 ]  [ c0 ] 
     /\   | 
     i=1 i=2  i=2 
    / \  | 
    [a1] [a2] [ b1 ] 
     | 
    i=2 
     | 
    [a3] 

你必須檢查fork返回值後打破循環。

+0

相信它或不是我的原始代碼確實從循環中斷開。無論如何,我添加了一個break語句,以防其子進程,現在,我的主要問題,是我寫的代碼應該有助於顛倒子進程的執行順序是否正確? –

+0

新代碼有幫助。 –

+0

是的,但我認爲這裏的問題是,有時第二個孩子沒有等待,因爲第二個孩子尚未創建(waitpid返回-1)。結果表明,一個過程不能等待使用這種技術的兄弟姐妹。感謝你的回答,但是它幫了很多。 –