1. 程式人生 > >程序——孤兒程序與殭屍程序

程序——孤兒程序與殭屍程序

在學習程序時,一定會學到fork函式建立子程序,由此引出兩個概念:

孤兒程序

當父程序已經退出而子程序仍在執行時,此時子程序就相當於一個孤兒,即為孤兒程序。孤兒程序會立即被init程序(1號程序)收養,此後的收尾工作均由init程序負責。
形象的解釋,init程序就好像一個民政局,每出現一個孤兒,init會立即領養,知道該孤兒完成自己的所有使命,淒涼地結束了它的一生時,init會代表黨和政府做好它的所有善後工作。
因此,孤兒程序並不會有什麼危害。

殭屍程序

當子程序已終止而父程序沒有呼叫wait或waitpid獲取子程序的退出狀態資訊,該資訊將一直佔用系統資源以等待父程序獲取。
殭屍程序終止的三種情況:
父程序獲取退出狀態
父程序退出,該程序組資源全部被回收
顯然,如果某父程序產生的殭屍程序過多,會對系統造成較大影響。

下面進行兩程序情景的模擬(環境:CentOS7)。
(一)孤兒程序

1.寫一個簡單的c程式,流程圖如下:

孤兒程序模擬程式流程圖

2.具體程式碼為
這裡寫圖片描述

3.執行結果為
這裡寫圖片描述

4.如上圖,兩個黃色的箭頭分別指向了子程序在父程序退出前後的ppid值,即父程序的程序號。顯然,父程序退出前,子程序的ppid與父程序pid相同,父程序退出後,子程序的ppid立即更改為1,即被init程序立即收養。

(二)殭屍程序

1.寫一個簡單的c程式,流程圖如下:

這裡寫圖片描述

2.具體程式碼為
這裡寫圖片描述

3.在編譯執行該程式碼前,寫一句命令列shell指令碼,用來實時監控子程序與父程序狀態,如下:
while :; do ps axj | grep mypro | grep pts/2 ; echo '------------------------------------------' ; sleep 1 ; done

4.執行程式碼,結果為
這裡寫圖片描述

5.這期間,監視視窗結果為
這裡寫圖片描述

6.綜上,
- 在子程序執行2s期間,其狀態為S+;
- 子程序執行結束後,父程序執行期間,子程序狀態變為Z+;
- 直至父程序執行結束,兩程序同時終止。
7.故而我們可以想到,如果父程序一直不終止,且一直不獲取子程序退出狀態,子程序這個殭屍程序將持續佔用系統資源,永遠不釋放。

相關推薦

孤兒程序殭屍程序

1、前言   之前在看《unix環境高階程式設計》第八章程序時候,提到孤兒程序和殭屍程序,一直對這兩個概念比較模糊。今天被人問到什麼是孤兒程序和殭屍程序,會帶來什麼問題,怎麼解決,我只停留在概念上面,沒有深入,倍感慚愧。晚上回來google了一下,再次參考APUE,認真

程序結束,其子程序不會結束,會掛到init程序孤兒程序殭屍程序[總結]

結論:一個父程序產生子程序,父程序結束(kill),子程序不會結束,子程序被init程序託管 下面是過程:     d.sh指令碼是一個ping命令,執行d.sh             &nb

孤兒程序殭屍程序[總結]

1、前言   之前在看《unix環境高階程式設計》第八章程序時候,提到孤兒程序和殭屍程序,一直對這兩個概念比較模糊。今天被人問到什麼是孤兒程序和殭屍程序,會帶來什麼問題,怎麼解決,我只停留在概念上面,沒有深入,倍感慚愧。晚上回來google了一下,再次參考APUE,認真總結一下,加深理解。 2、基本概念  

程序——孤兒程序殭屍程序

在學習程序時,一定會學到fork函式建立子程序,由此引出兩個概念: 孤兒程序 當父程序已經退出而子程序仍在執行時,此時子程序就相當於一個孤兒,即為孤兒程序。孤兒程序會立即被init程序(1號程

什麼是PHP7中的孤兒程序殭屍程序

什麼是PHP7中的孤兒程序與殭屍程序 基本概念 我們知道在unix/linux中,正常情況下,子程序是通過父程序建立的,子程

【Linux】程序狀態。重點殭屍程序孤兒程序

我們都知道程序可以認為是一個執行的程式,那麼為了弄明白正在執行的程序是什麼意思,我們需要先了解程序的狀態。。。下面的狀態在kernel原始碼中定義:  1.程序狀態          R執行狀態:並不意味著程序一定在執行中,它表明程序要麼在執行中要麼在執行佇列裡。   

什麼是殭屍程序孤兒程序?怎麼避免殭屍程序?

孤兒程序:父程序退出,子程序還在執行的這些子程序都是孤兒程序,孤兒程序將被 init 程序(進 程號為 1)所收養,並由 init 程序對它們完成狀態收集工作。 殭屍程序:程序使用 fork 建立子程序,如果子程序退出,而父程序並沒有呼叫 wait 或 waitpid 獲 取子程序的狀態資訊,那麼子

程序(二):程序開啟方式程序

目錄 multiprocess模組 multiprocess.process模組 process模組介紹 使用process模組建立程序 進階-多程序 利用類開啟程序 守護程序 socket聊天併發例項 多程序中的其他方法 multiprocess模組

程序的描述控制——程序的描述

程序的定義和特徵 1.定義 為了使參與併發執行的每個程式(含資料)都能夠獨立的執行,在作業系統中必須為之配置一個專門的資料結構,稱為程序控制塊(PCB)。系統利用PCB描述程序的基本情況和活動過程,進而控制和管理程序。 程式段、相關的資料段和PCB三部分構成了程序實體(又稱為程序影像)。一般

程序開啟方式程序

目錄 守護程序 multiprocess模組   之前我們已經瞭解了很多程序相關的理論知識,瞭解程序是什麼應該不再困難了,剛剛我們已經瞭解了,執行中的程式就是一個程序。所有的程序都是通過它的父程序來建立的。因此,執行起來的python程式

linux下程序號檢視結束程序

最近開始看資料結構和演算法,看的是C 的版本,所以今天在虛擬機器上裝了CentOS的系統,打算用linux自帶的gcc和gdb來學習。 以前用的linux作業系統都是ubuntu,突然換了centos

【Linux】程序間關係守護程序

程序間關係 程序組/作業/會話 程序組 程序組是一個或多個程序的集合,通常它們與一組作業相關聯,可以接受來自同一終端的各種訊號。 每個程序除了有一個程序ID之外,還屬於一個程序組。 每個程序組都有唯一的程序組ID(整數,也可以存放在pid_t型別

python程序寫檔案程序記錄日誌

假設有個程序,一直在寫一個名字叫做1的檔案,然後我們在它執行的過程中將檔案改名了,會發生什麼事情呢? 寫個程式試試: 然後執行它,此時可以看到: 因為程序得到了檔案的控制代碼,所以就算這個檔案改名為2了,它也會繼續往2這個檔案寫入的。 這樣也就解釋了apache在lin

程序併發如何防止殭屍程序——伺服器開發

在併發伺服器設計中,很常用的一種辦法是用fork為每個連線建立子程序來單獨處理客戶端請求。 流程圖如下: 可見,在父程序中直接執行accept等待下一個連線而並沒有用wait或者waitpid來等待子程序返回。這會造成怎樣的後果呢?當子程序exit退出的時候,它並沒有真正

父子程序終止順序僵死程序

在Linux_父子程序與fork一文中,我們知道子程序是在父程序呼叫fork之後生成的。那麼關於父子程序終止先後順序又會有什麼影響呢? 1、父程序在子程序之前終止 對於父程序已經終止的所有程序,它們的父程序都改變為init程序。我們稱這些程序由init程序收養。其操作過程大

殭屍程序和如何刪除殭屍程序

當一個子程序結束後,他的父程序沒有等待他(wait waitpid)清除他的所有資源時,它就變成一個殭屍程序。 在linux系統中,在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,佔用的記憶體等。但是仍然為其保留一定的資訊(包括程序號the process

Linux 殭屍程序孤兒程序

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

程序概念之孤兒殭屍

      在瞭解了程序是什麼後,接下來我們來了解一下程序的其他相關。      程序可以使用命令來進行檢視  程序的資訊可以通過/proc系統資料夾檢視;(如要檢視PID為1 的程序資訊,需要檢視/proc/1這個資料夾)大多數程序資訊同樣也可以用top和ps這些使用者級工

模擬實現殭屍程序孤兒程序的場景

  使用程式碼模擬實現殭屍程序, 孤兒程序的場景 殭屍程序: 1.殭屍狀態是一個比較特殊的狀態。當程序退出並且父程序沒有讀取到子程序退出的返回程式碼時就會產生殭屍程序 2.殭屍程序會以終止狀態保持在程序表中,並且會一直等待父程序讀取退出狀態程式碼 3.所以,只要子程序退

linux的殭屍程序孤兒程序的區別

殭屍程序 父程序還未呼叫wait或waitPID獲取子程序的程序號和狀態描述符前,子程序先於父程序退出exitexit(),子程序變成殭屍程序。此時父程序保留著程序號和狀態描述符,減少能建立的新程序,導致資源浪費 孤兒程序 父程序先於子程序退出, 子程序會變成孤兒程序,孤兒程序最