關於殭屍程序和孤兒程序

2021-07-31 13:25:52 字數 3414 閱讀 9416

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

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

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

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

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

z狀態 殭屍程序。。。

「殭屍」程序是什麼?通常情況下,殭屍程序的成因是因為該程序已經執行完畢,但是該程序的父程序卻無法完整的將該程序結束掉(如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號,即未接受其退出狀態資訊,那麼它就一直保持殭屍狀態),而造成該程序一直存在於記憶體中。

乙個程序在呼叫exit命令結束自己的生命的時候,其實

它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)所以殭屍程序需要父程序徹底結束他。

那麼如何檢視乙個程序是否為殭屍程序呢?

ps:將某個時間點的程序執行狀態選取下來

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

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

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

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

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

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

當你獲知它是乙個殭屍程序後,那麼你該如何乾掉它呢,那麼首先就得了解一下程序的管理。

程式之間的相互管理,是通過給予乙個訊號來進行管理的

檢視訊號(signal):

1、man 7 signal

2、kill -l

這裡顯示的是一些操作程序所需要的訊號及其編碼。

通常情況下,我們只需記住幾個特別重要的訊號即可。

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

9:強制中段乙個程序,如果該程序執行到一半(如vim)會產生.filename.swap的半產品檔案

15:正常結束乙個程序

18:繼續執行該程序

19:暫停乙個程序

kill -9 (+程序的pid)可以殺死這個程序

1

#include

2#include

3#include

4#include56

7void funtest()

8 17else

if(0 == pid)

18

22printf("i am father process.i will sleep two seconds\n");

23 sleep(2);

24 system("ps -o pid,ppid,state,tty,command");

25printf("father process is exiting\n");

26 }

2728

int main()

29

執行結果:43645成為殭屍程序

模擬實現多個殭屍程序

父程序迴圈建立子程序,子程序退出,造成多個殭屍程序。

1

#include

2#include

3#include

4#include56

7void funtest()

8 20else

if(0 == pid)

21

25else

2930 }

31printf("i am father process .i will sleep two second\n");

32 sleep(2);

33 system("ps -o pid,ppid,state,tty,command");

34printf("father process is exting\n");

3536 }

3738

int main()

39

執行結果:43963 43964 43965三個殭屍程序

通過訊號量機制

子程序退出時向父程序發出sigchild訊號。在訊號處理函式中呼叫wait進行處理殭屍程序

1

#include

2#include

3#include

4#include

5#include

6#include78

static

void sig_child (int signo)

9 17 }

1819

int main()

20 29else

if(0 == pid)

30

34printf("i am the father process. i will sleep two seconds\n");

35 sleep(2);

36 system("ps -o pid,ppid,state,tty,command");

37printf("father process is exiting\n");

38return

0;

執行結果:殭屍程序被父程序成功**。

乙個父程序退出後,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

1

#include

2#include

3#include

4#include56

int main()

7 13else

if(0 == pid)

14

18else

22return

0; 23 }

例如有個程序,它定期的產生乙個子程序,這個子程序需要做的事情很少,做完它該做的事情之後就退出了,因此這個子程序的生命週期很短,但是,父程序只管生成新的子程序,至於子程序 退出之後的事情,則一概不聞不問,這樣系統執行上一段時間之後,系統中就會存在很多的僵死程序。

倘若用ps命令檢視的話,就會看到很多狀態為z的程序。 嚴格地來說,僵死程序並不是問題的根源,罪魁禍首是產生出大量僵死程序的那個父程序。

那我們該如何消滅系統中大量的僵死程序呢?答案就是把產生大量僵死程序的那個元**掉(也就是通過kill傳送sigterm或者sigkill訊號啦)。殺掉元凶程序之後,它產生的僵死程序就變成了孤兒程序,這些孤兒程序會被init程序接管,init程序會wait()這些孤兒程序,釋放它們占用的系統程序表中的資源,這樣,這些已經僵死的孤兒程序 就能瞑目而去了

殭屍程序和孤兒程序

殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...

殭屍程序和孤兒程序

什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...

殭屍程序和孤兒程序

殭屍程序和孤兒程序 在unix系統程式設計中,常常會碰到兩個概念 僵死程序和孤兒程序 僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取...