Linux 中的殭屍程序與孤兒程序

2021-08-01 02:09:16 字數 1670 閱讀 1934

在介紹殭屍程序和孤兒程序之前我們先了解一下程序的幾種狀態

程序狀態

1. r狀態 程序要麼在執行要麼在執行佇列中。

2. s狀態 睡眠狀態,程序在等待某事件完成(可被中斷)

3. d狀態 不可中斷的睡眠狀態(通常其在第等待io結的束)

4. t狀態 被停止的程序 (傳送訊號sigstop停止程序 sigcont讓程序繼續執行)

5. x狀態 程序已死 已被** kernel你的do_exit函式返回的狀態。

6. z狀態 殭屍程序

其他幾種程序狀態我們很容易理解,那麼什麼是殭屍程序呢?

殭屍程序就是當程序退出並且父程序(使用wait()系統呼叫)沒有讀取到子程序退出的返回**時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態**,因為一直沒有接受狀態資訊而造成一直存在於記憶體當中。

在詳細說明殭屍程序之前我們首先介紹乙個指令

ps指令,ps + 以下指令

aux :檢視系統所有的程序資料

-a:所有的程序均顯示出來

-a:不與terminal有關的所有程序

-u:有效使用者相關的程序

-x:通常與a一起使用,可以列出較完整的資訊

-l:較長、較詳細地將該pid的資訊列出

通過ps指令我們可以觀察程序狀態,但是僅僅觀察程序狀態我們還不能明白的知道什麼是殭屍程序,下面我們再引入乙個指令kill

kill -l顯示所有kill下的訊號

而這裡我們只關注這幾個訊號

kill -1:sighup啟動被終止的程序,可讓該pid重新讀取自己的配置檔案

-9:sigkill殺死程序狀態(除了d)

-15:sigterm正常結束乙個程序

-18:sigcont繼續程序訊號

-19:sigstop暫停程序訊號

這個時候讓我們先模擬實現乙個殭屍程序

現在讓我們看看程序狀態

我們可以清楚地看到,當停下mytest執行狀態被停下之後父程序就變成了殭屍程序

那麼下面讓我們來看看孤兒程序是什麼?

孤兒程序:乙個父程序退出,而他的子程序還在執行,那麼子程序將會成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養。

同樣的,讓我們去實現一下孤兒程序,來看看它的程序狀態

輸出結果

那這裡就很明顯了,孤兒程序已經被建立並且被程序號為1的程序init所收養

Linux 殭屍程序與孤兒程序

之前的部落格有講過儲存程序資訊的乙個重要的資料結構,task struct結構體,其中,state表示程序可能出現的狀態。如下 static const char const task state array 我們對個別狀態進行解釋如下 s sleeping 淺度睡眠,也是不可中斷睡眠。d disk...

Linux 殭屍程序與孤兒程序

產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍程序,在第...

Linux 殭屍程序與孤兒程序

殭屍程序 產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍...