1. 程式人生 > >【C/C++】多程序:殭屍程序

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

  一個殭屍程序產生的過程是:父程序呼叫fork建立子程序後,子程序執行至其終止。程序終止後有些資訊對於父程序和核心還是很有用的,例如程序的ID號、程序的退出狀態、程序執行的CPU時間等。因此程序執行終止後,系統會回收所有核心分配給它的記憶體、關閉它所開啟的檔案等,但是還會保留以上極少的資訊,以供父程序使用,系統會向父程序傳送SIGCHLD訊號,父程序應及時呼叫wait函式來為子程序收屍,做一些收尾工作。但如果父程序沒有及時呼叫wait函式,則子程序的程序狀態變成ZOMBIE,即殭屍程序殭屍程序會一起佔用記憶體且無法通過使用kill殺死清除,除非父程序隨後呼叫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; } }

  編譯後,執行,效果如下圖:
zombie.

  首先在子程序執行期間直接檢視程序狀態,可以看到兩個a.out程序。

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

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

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