什麼是殭屍程序 zombie ?

2021-06-21 14:38:39 字數 1193 閱讀 3029

殭屍程序是指乙個已經終止、但是其父程序尚未對其進行善後處理獲取終止程序的有關資訊的程序,這個程序被稱為「殭屍程序」(zombie)。

怎樣產生殭屍程序

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

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

怎麼檢視殭屍程序

利用命令ps,可以看到有父程序id為1的程序是孤兒程序;s(state)狀態為z的是殭屍程序。

注意:孤兒程序(orphan process)是尚未終止但已停止(相當於前台掛起)的程序,但其父程序已經終止,由init收養;而殭屍程序則是已終止的程序,其父程序不一定終止。

怎樣來清除殭屍程序

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

把父程序殺掉。父程序死後,殭屍程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理殭屍程序,關機或重啟後所有殭屍程序都會消失。

避免zombie process的方法

在svr4中,如果呼叫signal或sigset將sigchld的配置設定為忽略,則不會產生僵死子程序。另外,使用svr4版的 sigaction,則可設定sa_nocldwait標誌以避免子程序僵死。 linux中也可使用這個,在乙個程式的開始呼叫這個函式signal(sigchld,sig_ign)。

呼叫fork兩次。

用waitpid等待子程序返回。

linux查詢殭屍程序 zombie程序

首先,我們可以用top命令來檢視伺服器當前是否有殭屍程序,可以看到第二行行尾有個 0 zombie,如果數字大於0,那麼意味著伺服器當前存在有殭屍程序 可以用ps和grep命令尋找殭屍程序 ps a ostat,ppid,pid,cmd grep e zz 命令選項說明 a 引數列出所有程序 o 自...

Linux 的殭屍 zombie 程序

可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...

Linux 的殭屍 zombie 程序

可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...