[英]fork and waitpid in C
我有這段代碼,也許我錯過了一些東西:
const int NPROCESSES = 32;
pid_t pids[128];
for (int i = 0; i < NPROCESSES;i ++) {
pids[i] = fork();
if (!pids[i]) {
/*... other code ...*/
exit(0);
}
}
for (int i = 0; i < NPROCESSES; i++)
waitpid(pids[i], 0, 0);
該程序應啟動32個進程,並等待所有進程終止。 但是有時程序會被子僵屍進程阻塞。 我哪里錯了?
使用:
waitpid(pids[i], 0, 0);
您指定一個確切的順序,父母將按照該順序收獲其子代:該順序與創建時的順序相同。
結果,如果一個子級由於某種原因阻塞或延遲,並且稍后創建的另一個子級已經完成(並稱為exit()
),則后者將保持僵屍狀態,直到父級獲得前者孩子第一。
因此,例如,如果在循環的第一次迭代中創建的進程需要1分鍾才能完成,而其余31個進程在1秒內完成,則您可以觀察到31個僵屍進程正在等待其父(他們(家長)將首先等待獲得該延遲的過程。
若要更改此行為,父母可以使用:
waitpid(-1, NULL, 0);
代替。 在waitpid()
的第一個參數中,等於-1
的值意味着它將引用man 2 waitpid
引用任何子進程:
pid
的值可以是:
< -1
意思是等待任何進程組ID等於pid的絕對值的子進程。
-1
意思是等待任何子進程。
0
意思是等待任何進程組ID與調用進程的ID相等的子進程。
> 0
意思是等待進程ID等於pid值的子進程。
或者,您可以只使用:
wait(NULL);
這與waitpid(-1, NULL, 0)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.