簡體   English   中英

叉程序給 <defunct> 一段時間后處理

[英]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進行編碼,則應考慮使用QtPOCO之類的框架(均提供對過程的支持)。

您應該關心進程間的通信 (也許使用pipe(7) -s或socket(7) -s以及一些事件循環 ,請參見poll(2) ...)和同步問題。 也許看看MPI0mq

(您可能需要閱讀更多內容)

也許strace(1)可能有助於調試問題。

不要忘記檢查每個 系統調用 請參閱syscalls(2)errno(3)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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