【C/C++】多程序:殭屍程序
阿新 • • 發佈:2019-01-23
一個殭屍程序產生的過程是:父程序呼叫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;
}
}
編譯後,執行,效果如下圖:
首先在子程序執行期間直接檢視程序狀態,可以看到兩個a.out
程序。
子程序列印完10行日誌後,再檢視程序狀態,可以看到子程序已經程序zombie
狀態,即殭屍程序
。
用命令kill
掉父程序,或等待父程序執行到wait
函式,則可發現子程序已經被系統回收了。
文章開頭提到系統會向父程序傳送SIGCHLD
訊號,那下一篇就來講講如何註冊訊號監聽及處理函式:多程序:訊號量的監聽與處理函式。