[英]fork 100 processes at same time and sometimes some processes become zombie
[英]Fork program gives <defunct> processes after some time
我正在開發一個使用fork()
執行各種任務的程序。 我正在啟動程序,一切正常。 我觀察到一段時間(1天)后,我被<defunct>
進程淹沒了,超過600 700 ...其中最大forks設置為500。這是代碼:
int numforks = 0;
int maxf = 100;
// READ FROM FILE ...
while (fgets(nutt,2048,fp))
{
fflush(stdout);
if (!(fork()))
{
some_time_intensive_function();
exit(0);
}
else
{
numforks++;
if (numforks >= maxf)
{
wait(NULL);
numforks--;
}
}
}
// DON'T EXIT PROGRAM TILL ALL FORKS ARE FINISHED
while(numforks>0)
{
wait(NULL);
numforks--;
}
// CLOSE READ FILE ...
該程序始終像線程池一樣保留500個fork。
我不太了解<defunct>
進程是什么,但我聽說它們不是子進程(如SEG FAULT
發生的錯誤,而是父進程未正確等待。
我想閱讀<defunct>
,有什么辦法解決嗎?
我重復一遍,這種情況會在1-2天后出現。
謝謝。
我認為您有兩個問題:
首先,由於子進程終止之外的其他原因, wait
可以返回(如果終止,則它將退出已失效的進程)。 我認為您需要傳遞一個非null的指針,並檢查返回的等待狀態。 僅在適當的時候才減少木叉。
其次, numforks
不會(有效地)限制子進程的總數。 如果父進程啟動兩個進程,它們將繼續繼承0和1的numforks
。然后,每個子進程將啟動500和499個更多的子進程。
我認為您需要在time_consuming_process()
之后exit(0)
(或break
time_consuming_process()
。
(我假設您正在Linux或MacOSX等其他POSIX系統上運行)
提防孤立進程 。
閱讀高級Linux編程 ,其中有幾章與您的問題有關。
您最好保留 fork
的結果(在某些pid_t
變量或字段中),並處理所有三種情況(> 0: fork
成功; == 0,在子進程中,<0: fork
失敗!)。 您可能應該適當地調用waitpid(2) 。 在子進程中,調用exit(3) (或execve(2) ...)是合理的
也許您應該處理SIGCHLD
信號。 仔細閱讀signal(7) 。
(您的程序顯示不夠,需要一本書來解釋所有這些內容)
根據經驗,您不希望有許多可運行的進程。 在典型的便攜式計算機或台式計算機上,您不應有超過十二個可運行的進程。 使用top(1)或ps(1)列出您的進程(特別是要了解您有多少個進程)。 也許在終端中使用(至少在調試過程中)bash ulimit
內置 (它從您的shell內部調用setrlimit(2) ),例如,作為ulimit -u 50
來限制進程數(至50)。
如果使用正版C ++ 11進行編碼,則應考慮使用Qt或POCO之類的框架(均提供對過程的支持)。
您應該關心進程間的通信 (也許使用pipe(7) -s或socket(7) -s以及一些事件循環 ,請參見poll(2) ...)和同步問題。 也許看看MPI或0mq 。
(您可能需要閱讀更多內容)
也許strace(1)可能有助於調試問題。
不要忘記檢查每個 系統調用 。 請參閱syscalls(2)和errno(3) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.