殭屍進程,僵死進程

來源:互聯網
上載者:User

殭屍進程,僵死進程
 

 

 

在UNIX系統中,殭屍進程是指完成執行(通過exit系統調用,或運行時發生致命錯誤或收到終止訊號所致)但在作業系統的進程表中仍然有一個表項(進程式控制制塊PCB),處於”終止狀態“的進程。這發生於子進程需要保留表項以允許其父進程讀取子進程的exit status:一旦退出態通過wait系統調用讀取,殭屍進程條目就從進程表中刪除,稱之為”回收(reaped)”。正常情況下,進程直接被其父進程wait並由系統回收。進程長時間保持殭屍狀態一般是錯誤的並導致資源泄漏。

英文術語zombie process源自en:zombie — 不死之人,隱喻子進程已死但仍然沒有被收割。與正常進程不同,kill命令對殭屍進程無效。孤兒進程不同於殭屍進程,其父進程已經死掉,但孤兒進程仍能正常執行,但並不會變為殭屍進程,因為被init(進程ID號為1)收養並wait其退出。

子進程死後,系統會發送SIGCHLD 訊號給父進程,父進程對其預設處理是忽略。如果想響應這個訊息,父進程通常在SIGCHLD 訊號事件處理常式中,使用wait系統調用來響應子進程的終止。

殭屍進程被收割後,其進程號(PID)與在進程表中的表項都可以被系統重用。但如果父進程沒有調用wait,殭屍進程將保留進程表中的表項,導致了資源泄漏。某些情況下這反倒是期望的:父進程建立了另外一個子進程,並希望具有不同的進程號。如果父進程通過設定事件處理函數為SIG_IGN顯式忽略SIGCHLD訊號,而不是隱式預設忽略該訊號,或者具有SA_NOCLDWAIT標誌,所有子進程的退出狀態資訊將被拋棄並且直接被系統回收。

UNIX命令ps列出的進程的狀態(”STAT”)欄標示為 “Z“則為殭屍進程。

收割殭屍進程的方法是通過kill命令手工向其父進程發送SIGCHLD訊號。如果其父進程仍然拒絕收割殭屍進程,則終止父進程,使得init進程收養殭屍進程。init進程周期執行wait系統調用收割其收養的所有殭屍進程。

為避免產生殭屍進程,實際應用中一般採取的方式是:

例子:

 

 
12345678910111213141516171819202122 #include <sys/wait.h>#include <stdlib.h>#include <unistd.h> int main(void){  pid_t pids[10];  int i;   for (i = 9; i >= 0; --i) {    pids[i] = fork();    if (pids[i] == 0) {      sleep(i+1);      _exit(0);    }  }   for (i = 9; i >= 0; --i)    waitpid(pids[i], NULL, 0);   return 0;}

我們的公用號

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.