我們先了解一下程序都有哪幾種狀態。
kernel源**裡定義了程序的如下狀態:
· r 執行狀態(running):表明程序要麼是在執行中要麼是在執行佇列裡。
· s 睡眠狀態(sleeping):意味著程序在等待事件完成,有時叫做可中斷睡眠。
· d磁碟休眠狀態(disk sleep):不可中斷睡眠狀態,在這個狀態程序通常會等待i/o的結束。
· t 停止狀態(stopped):可以通過傳送sigstop訊號給程序來停止程序。這個暫停的程序可以通過傳送sigcont訊號讓程序繼續執行。
· x 死亡狀態(dead):只是乙個返回狀態,不會在任務列表裡看到。
· z 殭屍狀態(zombie):當程序退出並且父程序沒有讀取到子程序退出的返回**時就會產生殭屍狀態。殭屍進城會以終止狀態保持在程序表中,會一直等待父程序讀取退出狀態資訊。
我們知道,在unix/linux中,正常情況下,子程序由父程序建立,子程序可以再建立新程序。子程序的退出和父程序的執行是乙個非同步的過程,即父程序永遠無法**子程序到底什麼時候結束。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態。
1.殭屍程序
父程序通過fork()建立子程序,子程序退出後,父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,這時子程序就成為殭屍程序。
測試**:
#include
#include
#include
int main()
else
if(pid == 0)//子程序
else
//父程序
return
0;}
測試結果:
殭屍程序的危害:
我們知道,在建立程序的時候會給他分配相應的系統資源,如果子程序退出後,父程序不進行**,那麼它所占用的那塊資源也就不會釋放,就會造成記憶體洩露。
2.孤兒程序
乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。
測試**:
#include
#include
#include
int main()
else
if(pid == 0)//子程序
else
//父程序
return
0;}
測試結果:
10秒後,父程序退出,子程序被1號程序收養。
Linux 模擬實現殭屍程序和孤兒程序
殭屍程序 z zombie 子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入z狀態。1 include 2 include 3 include 4 include 5 6 using namespace std 7 8 int main 9 14 if id 0 22 23 24 ...
模擬實現殭屍程序
當程序退出並且父程序沒有讀取到子程序退出返回的 時就會產生殭屍程序。乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫exit,它的作用是 使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀 ...
模擬實現殭屍程序和孤兒程序
殭屍程序 乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。程序在終止時,系統會 所有核心分配給它的記憶體 關閉它開啟的所有檔案等等,但還會保留一些極少的資訊,因為 程序終止後有些資訊對於父程序和核心還是很有用的,例如程序的id號 程序的退出狀態 程序執行...