簡體   English   中英

linux永遠不會終止子進程,直到父進程結束?

[英]does linux never end child process until the parent ends?

請在c中考慮以下代碼:

    int main()
    {
     pid_t cpid;
     cpid = fork();
     if (cpid == -1)
     {
            perror("fork");
            return 0;
     }
     if (cpid == 0)
     {
            printf("I'm child\n");
            _exit(0);
     }
     else
     {
            while(1)
            {
                    printf("I'm parent\n");
                    sleep(1);
            }
     }
     return 0;
    }

運行代碼后,我希望它可以運行child並在完成后退出。 但是當我跑步時

    pgrep executable_name

要么

    ps fax

它顯示子進程ID,我不知道它只是工作進程的歷史記錄還是真的沒有結束/終止子進程?

提前致謝

子進程將一直保留到其父進程死亡或父進程通過wait系統調用清理為止。 (在終止孩子與清理孩子之間的這段時間內,這被稱為僵屍進程。)

原因是父級可能對子級的返回值或最終輸出感興趣,因此在查詢該信息之前,進程條目保持活動狀態。

編輯:

使用sigchld處理程序立即清除進程而不會阻塞的示例代碼:

http://arsdnet.net/child.c

請注意,系統調用(例如睡眠,選擇或文件讀/寫)可能會被信號中斷。 無論如何,這都是正常的操作,因為它們會失敗,並將errno設置為EINTR。 發生這種情況時,您可以再次嘗試完成操作。 這就是為什么我的示例代碼在父母中兩次調用睡眠-第一個長時間睡眠被孩子垂死打斷,然后第二個較短的睡眠讓我們確認該過程在父母去世之前實際上已經清除。

BTW信號處理程序通常不應該做太多事情,應該盡快返回並避免線程不安全的事情。 通常不建議在其中使用printfing。 我在這里做的只是為了讓您可以觀看發生的一切。

您需要在父級中調用wait() ,否則子級進程將永遠不會被獲得(它會成為僵屍)。 *


*除非父母本身也退出。

暫無
暫無

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

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