標籤:
一個殭屍進程產生的過程是:父進程調用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++】多進程:殭屍進程