[英]How to fork() n child processes correctly in C?
那是我的代碼。
#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
謝謝您的幫助。 現在我會嘗試一下。
PS對不起,我的英語不好。 我希望你能理解我說的話。
您的代碼在我的計算機上完美運行。 它可以依賴於os。
但是如果沒有給你的程序賦予參數,你應該檢查argc是否不等於1以避免分段錯誤。
系統將空閑PID分配給進程。 您可以將進程ID分配4000並且子ID為3900.您的作業文件甚至不應該放數字,因為無論如何第一個進程ID永遠不會相同。
您獲得無序輸出的原因是您無法准確預測哪個孩子何時變為活動狀態。 因此,可能會發生第一個孩子的執行被延遲,直到你的第二個孩子被fork()
編輯並開始。
您的孩子通常會獲得順序PID,盡管這取決於操作系統。
這兩個問題都不應該是你的計划任務的問題 - 絕對的PID都不是很重要(如上所述,每個操作系統可以做自己的事情,順序或隨機分配PID),也不是孩子做他們的東西的順序:子項的每個部分可以具有不同的執行時間,從而導致無序輸出。 只要數據正確傳輸,就會計算 - 如果父級生成序列然后分叉,則會出現這種情況。 在這種情況下,子進程的內存布局與fork時的父進程相同。 因此,父級可以修改其“數據傳輸陣列”,而不會影響已經運行的子級。
為了減少混淆,您可以刪除每行中PID的輸出。 也許它們可以在子過程的相應開始時輸出,但在那之后,應該足夠說例如Child 3: straight length 6 <S6,H5,C4,S3,H2,SA>
而不重復PID。
有了預期的輸出,你的作業很可能首先應該分離所有進程,然后再調用wait。
只需跳過循環中的等待調用並在下面單獨執行一個循環,直到wait
返回-1
並將errno
設置為ECHILD
。 請注意,子項的輸出順序將是隨機的,或者至少不完全按順序排列,因此不一定是2 1 3 4 5。
這只是猜測,如果您想要更具體的答案,您應該提供更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.