2013-01-21 28 views
0

這是一個非常基本的問題。父進程將創建一些共享內存,並在其中放置兩個整數,然後分叉一個將訪問共享內存並計算其總和的子進程。這一切都很好,但孩子如何告知父母已完成計算?我是否需要在兩個流程之間創建一個管道來執行此操作?或者waitpid()足以實現這一點?如何通知父母流程我已完成

謝謝!

+3

你嘗試過'waitpid'嗎,或者你是否在等待有人告訴你嘗試? – paddy

+0

@paddy是的,我在最後提到了waitpid,但我不確定它是否足夠,因爲在我看來,waitpid()只在子進程終止時才被調用。但是如果我希望子進程在計算總和後執行更多任務呢?在那種情況下,孩子需要通知家長已完成計算總額並繼續進行其餘的工作。 – zsljulius

+0

您的帖子中未提及您的子進程是否需要退出。現在有一個很好的答案可以幫助你。 – paddy

回答

0

如果您的子進程在計算完整數之後不再需要,它可以從main返回總和,父進程可以使用waitpid檢索結果。在這種情況下,孩子會是這個樣子:

子過程:

int main(int argc, char** argv) { 
    int a,b; 
    /* read integers a and b from shared memory */ 

    /* return sum */ 
    return a + b; 
} 

如果子進程仍然需要爲父母做進一步的工作,成立了孩子和家長之間的管道或者安排其他形式的IPC來回傳遞信息。

+1

這隻有在a + b <128'的情況下才有效。 –

+0

@WilliamPursell:D'oh!我忘記了附加在返回值上的退出值。這第一個解決方案很糟糕 - 父母和孩子應該建立一個管道或IPC進行通信。 –

3

如果孩子在寫完總和後退出,那麼waitpid()就足夠了。否則,你需要一些IPC(一個互斥/信號/管道)來表示完成。

+0

這正是我想我應該做的。我想過在waitpid中使用status參數來表示求和任務的完成,但不知道是否可以這樣做。 – zsljulius

0

waitpid()應該可以用於此目的。只需在父母和父母做waitpid(),並在孩子計算相同的共享內存位置,只是返回和waitpid()將解除封鎖,父母可以做任何想要的總和。