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

在介紹殭屍進程和孤兒進程之前我們先了解一下進程的幾種狀態
進程狀態
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所收養

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章