Linux殭屍程序詳解

2021-06-18 17:43:54 字數 2263 閱讀 5560

1.殭屍程序概念:

殭屍程序(zombie 

process

):就是已經結束了的程序,但是沒有從程序表中刪除。太多了會導致程序表裡面條目滿了,進而導致系統崩潰,倒是不占用其他系統資源。

在linux

程序的狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所有記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有任何記憶體空間。它需要它的父程序來為它收屍,如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號,那麼它就一直保持殭屍狀態,如果這時父程序結束了,那麼init程序自動會接手這個子程序,為它收屍,它還是能被清除的。但是如果如果父程序是乙個迴圈,不會結束,那麼子程序就會一直保持殭屍狀態,這就是為什麼系統中有時會有很多的殭屍程序。

2.殭屍程序產生的原因:

每個linux程序在程序表裡都有乙個進入點(entry),核心程式執行該程序時使用到的一切資訊都儲存在進入點。當用ps命令察看系統中的程序資訊時,看到的就是程序表中的相關資料。當以fork()系統呼叫建立乙個新的程序後,核心程序就會在程序表中給這個新程序分配乙個進入點,然後將相關資訊儲存在該進入點所對應的程序表內。這些資訊中有一項是其父程序的識別碼。當這個程序走完了自己的生命週期後,它會執行exit()系統呼叫,此時原來程序表中的資料會被該程序的退出碼(exit code)、執行時所用的cpu時間等資料所取代,這些資料會一直保留到系統將它傳遞給它的父程序為止。由此可見,defunct程序的出現時間是在子程序終止後,但是父程序尚未讀取這些資料之前。

3.殭屍程序的檢視:

用top命令,可以看到

tasks: 123 total,   1 running, 122 sleeping,   0 stopped,   0 zombie

zombie前面的數量就是殭屍程序到數量;

ps -ef

出現:root     13028 12956 0 10:51 pts/2    00:00:00 [ls]

最後有defunct的標記,就表明是殭屍程序。

4.殭屍程序解決辦法:

4.1 改寫父程序,在子程序死後要為它收屍。具體做法是接管sigchld訊號。子程序死後,會傳送sigchld訊號給父程序,父程序收到此訊號後,執行 waitpid()函式為子程序收屍。這是基於這樣的原理:就算父程序沒有呼叫wait,核心也會向它傳送sigchld訊息,儘管對的預設處理是忽略,如果想響應這個訊息,可以設定乙個處理函式。

4.2 把父程序殺掉。父程序死後,殭屍程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。

kill -9 `ps -ef | grep "process name" | awk ''`

其中,「process name」為處於zombie狀態的程序名。

4.3 殺父程序不行的話,就嘗試用skill -t tty關閉相應終端,tty是程序相應的tty號(終端號)。但是,ps可能會查不到特定程序的tty號,這時就需要自己判斷了。

4.4 實在不行,重啟系統吧,這也是最常用到方法之一。

5.殭屍程序例項:

/*-----zombie1.c-----*/

#include "sys/types.h"

#include "sys/wait.h"

#include "stdio.h"

#include "unistd.h"

int main(int argc, char* argv)

sleep(2);}}

會不停地產生僵死程序ls;

/*-----zombie2.c-----*/

#include

#include

main()

/*wait();*/

/*waitpid(-1,null,0);*/

sleep(60);

printf("parent pid=%d \n", getpid());

exit(0);

}60s內會不斷產生殭屍程序,直到父程序exit(0);

如果在呼叫wait/waitpid來為子程序收屍,就不會產生殭屍程序了。

ps:執行例子,先gcc zombie1.c -o zombie編譯,然後執行zombie;

然後可以可用ps -ef來檢視是否產生了殭屍程序。

其他知識:

execl:程序進入了shell環境執行 執行完程序結束

system=fork+exec+waitpid:執行完程序仍然存在,只是用它的子程序執行了操作。

殭屍程序詳解

xk 鋪墊1 fork 和exec unix中派生乙個新的程序的唯一方法是fork 函式 有些系統可能提供它的各種變體 父程序中開啟的所有描述符在fork 之後由子程序分享。存放在硬碟上的程式檔案能夠被unix執行的唯一途徑是 由乙個現有程序呼叫exec函式中的某乙個 exec函式有6個,作用相同,...

Linux中殭屍程序和孤兒程序詳解

1 殭屍程序 乙個子程序在其父程序沒有呼叫wait 或waitp程式設計客棧id 的情況下退出,這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到其父程序退出後該程序將被init 執行結果 2 孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子...

Linux 殭屍程序

怎樣產生殭屍程序的 乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫 exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀 在linux程序的狀態中,殭屍程序是非常特殊的...