先了解下程序都有什麼狀態:
程序狀態:就緒,阻塞,執行
linux下程序狀態:
執行狀態®:並不意味著程序一定在執行中,它表明程序在執行中,或在執行佇列裡(只要拿到時間片就能執行)
可中斷休眠狀態(s):當前處於休眠狀態,但這種休眠可以被打斷(也稱睡眠狀態)
不可中斷休眠狀態(d):當前處於休眠狀態,但這種休眠不會被打斷(也稱磁碟休眠狀態)
停止狀態(t):什麼都不幹
死亡狀態(x):(只是乙個返回狀態)
僵死狀態(z):程序已經退出,但資源沒有完全被釋放時處於的一種狀態(等待後續被處理的一種狀態)
談到殭屍程序,我們首先要知道為什麼有了殭屍程序?因為父程序需要知道子程序退出時的退出原因及結果。
1.什麼是殭屍程序?
它是乙個比較特殊的狀態。當子程序退出並且父程序沒有讀取到子程序退出的返回**,導致子程序資源無法完全釋放,就會產生僵死(屍)程序。
產生:子程序退出,作業系統就要封鎖線程,子程序的退出原因儲存在自己身上(pcb中),所以作業系統也不能直接**子程序資源,而是通知父程序,但父程序沒有關注到作業系統的通知,導致子程序退出了但資源沒有完全釋放
2.建立乙個殭屍程序(只要讓子程序先退出,父程序一直執行即可)
測試**如下:
#include
#include
#include
intmain()
else
if(id==0)
}else
}return0;
}
linux下的結果:
在另乙個終端下啟動監控,檢視程序資訊(ps aux | grep jsjc)可以看到子程序進入z狀態:
注:狀態後面帶 + 表示前台程序(當前只能乙個程序做事),不帶 + 表示後台程序(當前可以有很多程序做事)
3.危害:
導致記憶體洩漏:
4.如何避免殭屍程序?
只要讓子程序退出後,父程序接收子程序的退出資訊就可以避免,所以,父程序通過程序等待的方式,**子程序的資源,獲取子程序的資訊
孤兒程序恰恰相反,是父程序退出,子程序就稱之為「孤兒程序」
1.孤兒程序要被領養?父程序退出,資源被**,子程序沒父程序了,如果子程序退出,就需要有程序來**它,否則成為殭屍狀態
2.建立乙個孤兒程序(只需要讓父程序先退出,子程序繼續執行)
測試**如下:
#include
#include
#include
intmain()
else
if(id==0)
}else
}return0;
}
linux 下的執行結果:(由下圖可以看到,父程序退出後,子程序被1號程序領養)
3.如果父程序退出,父程序父程序會變成殭屍狀態嗎?
不會,因為父程序的父程序為bash,父程序的退出資訊會由bash接收到
Linux 程序狀態 殭屍程序 孤兒程序
檢視程序狀態的命令 ps aux ps axj 命令 r running 可執行狀態 並不一定正在占有cpu,它表明程序要麼是正在執行,要麼是在執行佇列裡。實際上分為running和ready兩種狀態。s task interruptible 可中斷的睡眠狀態 處於這個狀態的程序因為等待某事件的發生...
Linux殭屍程序和孤兒程序
程式執行到結尾的時候,有兩種情況。子程序先退出,或者父程序先退出。如果父程序先退出的話,那麼子程序就會變成孤兒程序,最後被init接管,我們來看乙個例子。我們可以看到子程序的父程序變成了init,孤兒程序並不可怕,它們最後會被統一銷毀。但是如果子程序先退出呢?子程序先退出有兩種情況 1.呼叫wait...
linux下殭屍程序和孤兒程序
子程序是通過父程序建立的,子程序也可以繼續建立子程序。父程序無法 子程序到底什麼時候結束,當乙個子程序結束之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取得子程序的終止狀態。殭屍程序 子程序結束了,但是父程序沒有呼叫wait 或者waitpid 取得子程序的終止狀態,這個子程序將變成...