2016-09-28 75 views
4

我知道還有另一個同名的線程,但這實際上是一個不同的問題。分叉進程的執行順序

當進程分叉多次時,父節點是否在子節點之前完成執行?反之亦然?同時?

下面是一個例子。假設我有一個for循環,將1個父進程分爲4個子進程。在for循環結束時,我希望父進程通過管道將一些數據提供給子進程。數據被寫入每個子進程的相應stdin。

在任何孩子執行他們的代碼之前,父母會先發送數據嗎?這很重要,因爲我們不希望它從一個無效的stdin開始工作。

+1

當進程分叉多次時,父節點在子節點之前是否完成執行?反之亦然?同時? - 同時取決於調度程序及其不可預測性。 –

+0

您可以使用等待函數調用等待子進程完成,然後父進程將執行 –

+0

如何獲取子進程的管道?這不是'popen()'的設計目的嗎? (另外,'fork()'返回後,應該存在兩個進程,所以在那個時候,無論你在哪一個進程中,一個完整的子進程應該存在有效的標準輸入和標準輸出) – ebyrob

回答

0

它們將同時執行。這基本上就是流程的重點。

研究互斥鎖或其他方式來處理併發。

6

執行順序由特定的操作系統調度策略決定,不受任何保證。爲了同步這些過程,有專門爲此設計的用於進程間通信(IPC)的特殊設施。提到的管道就是一個例子。他們使讀取過程實際上等待爲其他進程寫入它,創建一個(單向)同步點。其他例子是FIFO和套接字。對於更簡單的任務,可以使用wait()系列功能或signals

+0

在這種情況下,不應忽視提及'wait()'函數族。 –

+0

對。我會補充一些。 –

1

當一個進程分叉多次時,父節點是否在子節點之前完成執行?反之亦然?同時? -

同時並取決於調度程序及其不可預知的。

Using pipe to pass integer values between parent and child

此鏈接詳細解釋了有關父進程和孩子之間共享數據。 由於您有四個子進程,您可能需要在每個子進程之間創建不同的獨立管道。

寫入到管道的每個字節的數據都只能被讀取一次。它不會複製到每個進程打開管道的讀取結束。

Multiple child processes reading/writing on the same pipe

或者你可以嘗試在數據傳輸共享內存。