2012-02-05 72 views
9

這是我的代碼。如何在C中fork()n子進程?

#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) 
{ 
    int i, pid; 

for(i = 0; i < atoi(argv[1]); i++) { 
    pid = fork(); 
    if(pid < 0) { 
     printf("Error"); 
     exit(1); 
    } else if (pid == 0) { 
     printf("Child (%d): %d\n", i + 1, getpid()); 
     exit(0); 
    } else { 
     wait(NULL); 
    } 
} 

} 

輸出就是這樣。

Child (1): 5676 
Child (2): 4624 
Child (3): 4800 
Child (4): 5596 
Child (5): 5580 

但是,這不是我的作業期望的輸出。 它應該是這樣的。代碼有什麼問題?有人能幫我嗎?

Child (2): 4625 
Child (1): 4624 
Child (3): 4626 
Child (4): 4627 
Child (5): 4628 

謝謝你的幫助。現在我會嘗試一下。

P.S.對不起,我的英語不好。我希望你能理解我說的話。

回答

3

你的代碼在我的電腦上完美工作。它可能與操作系統有關。

但是,如果argc不等於1,以避免在程序中沒有參數的情況下出現段錯誤,

+0

謝謝你的建議。 – 2012-02-05 14:07:16

+0

是的,它真的是依賴於操作系統。我在學校的Linux服務器上測試了我的程序。我獲得了預期的產出。非常感謝你。 – 2012-02-06 12:54:23

1

系統將自由PID分配給進程。您可以將進程ID分配爲4000,並且其子代碼爲3900.您的作業紙甚至不應該放置數字,因爲第一個進程ID無論如何都不會相同。

+0

謝謝。我提供了關於我作業中包含的程序的一些描述。請幫忙。 – 2012-02-05 14:06:24

1

你得到一個無序輸出的原因是你不能準確預測哪個孩子在什麼時候變成活動的。所以可能會發生第一個孩子的執行被推遲,直到你的第二個孩子被編輯並開始。

您的孩子通常會獲得順序PID,儘管這取決於操作系統。

這兩個問題都不應該成爲您計劃任務的問題 - 既不是絕對PID真的很重要(正如所說的,每個操作系統都可以自己做,按順序或隨機分配PID),也不是孩子們做他們的東西:孩子的每個部分可以有不同的執行時間,導致無序的輸出。只要數據傳輸正確,這個計數就會被計算 - 如果父代生成序列然後分叉,就是這種情況。在這種情況下,子進程的內存佈局與fork時父進程的內存佈局相同。所以父母可以修改其「數據傳輸陣列」而不影響已經運行的孩子。

爲減少混淆,您可以在每行中刪除PID的輸出。也許它們可以在子進程的相應開始時輸出,但在此之後,它應該足以說明例如Child 3: straight length 6 <S6,H5,C4,S3,H2,SA>而不重複PID。

+0

謝謝。我提供了關於我作業中包含的程序的一些描述。請幫忙。 – 2012-02-05 14:06:33

+1

不僅pid分配依賴於操作系統,子進程的調度依賴於運行時間;並不難保證第一個孩子是第一個計劃跑步的孩子。 – tbert 2012-02-05 20:45:21

+0

@tbert Exactl這就是我想說的與我的答案的「第一」部分,一個提到預測的東西。 – glglgl 2012-02-05 21:25:50

1

有了這個預期的輸出,很可能你的作業應該先分出所有的過程,然後等待。

簡單地跳過循環等待呼叫,下面做一個單獨的一個應該循環,直到wait回報-1errno設置爲ECHILD。請注意,孩子的輸出順序將是隨機的,或者至少不是完全按順序,所以不一定2 1 3 4 5.

這只是一個猜測,但如果你想要更多的信息,你應該提供更多信息具體答案。

+0

謝謝。我提供了關於我作業中包含的程序的一些描述。請幫忙。 – 2012-02-05 14:06:11