簡體   English   中英

C中的fork和waitpid

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM