Linux 殭屍程序 Z狀態 和孤兒程序

2021-09-25 15:19:25 字數 1576 閱讀 1258

先了解下程序都有什麼狀態:

程序狀態:就緒,阻塞,執行

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 取得子程序的終止狀態,這個子程序將變成...