【C/C++】多進程:殭屍進程

來源:互聯網
上載者:User

標籤:

  一個殭屍進程產生的過程是:父進程調用fork建立子進程後,子進程運行至其終止。進程終止後有些資訊對於父進程和核心還是很有用的,例如進程的ID號、進程的退出狀態、進程啟動並執行CPU時間等。因此進程運行終止後,系統會回收所有核心分配給它的記憶體、關閉它所開啟的檔案等,但是還會保留以上極少的資訊,以供父進程使用,系統會向父進程發送SIGCHLD訊號,父進程應及時調用wait函數來為子進程收屍,做一些收尾工作。但如果父進程沒有及時調用wait函數,則子進程的進程狀態變成ZOMBIE,即殭屍進程殭屍進程會一起佔用記憶體且無法通過使用kill殺死清除,除非父進程隨後調用wait函數或父進程也運行結束或其它因素父進程被殺終結等,殭屍進程才會被回收。

  以前一篇文章【C/C++】多進程:父進程監聽子進程狀態 wait()的使用的範例程式碼加以簡單修改下,用來示範殭屍進程:

        // if (count > CHILD_COUNT) {        // 原CHILD_COUNT改為10        if (count > 10) {    FILE * fMain = freopen("/Users/sodino/workspace/xcode/Define/Define/main.txt", "w", stdout);    // 在重新導向父進程的標準輸出資料流後,添加上如下的延時代碼    int count = 0;    while(1) {        printTime();        printf("Main Process sleep10, count=%d \n", count);        sleep(10);        if (count > 100) {            break;        }    }

  編譯後,運行,效果如:

  首先在子進程運行期間直接查看進程狀態,可以看到兩個a.out進程。

  子進程列印完10行日誌後,再查看進程狀態,可以看到子進程已經進程zombie狀態,即殭屍進程

  用命令kill掉父進程,或等待父進程執行到wait函數,則可發現子進程已經被系統回收了。

  文章開頭提到系統會向父進程發送SIGCHLD訊號,那下一篇就來講講如何註冊訊號監聽及處理函數:多進程:訊號量的監聽與處理函數。

【C/C++】多進程:殭屍進程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.