殭屍程序的危害及避免

2021-09-23 07:39:32 字數 715 閱讀 3009

由於子程序的結束和父程序的執行是乙個非同步的過程,所以父程序不知道子程序什麼時候結束,這可能導致當子程序結束時父程序太忙而丟失子程序結束時的狀態資訊。於是,unix提供了一種機制保證了只要父程序想要看到子程序結束的資訊,就能看到。這種機制就是:在每個程序退出時,核心釋放所有資源,但扔然保留一定的資訊,如程序號,退出資訊,執行時間等等,這些資訊要知道父程序來取,並且由父程序釋放,但我們知道程序對sigchld訊號的預設處理方式為忽略,這樣子程序的保留的那部分資訊可能就一直得不到釋放,導致殭屍程序。

乙個殭屍程序並不怕,可怕的是一群殭屍程序,我們知道殭屍程序會保留程序號,而我們的系統能夠使用的程序號是有限的,即如果大量的殭屍程序存在,就可能因為沒有可用的程序號而導致系統不能產生新的程序。

⒈父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。

⒉ 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**。

⒊ 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign) 通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號。

⒋ 連續fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。

什麼是殭屍程序,有何危害?怎麼避免殭屍程序?

什麼是殭屍程序?當子程序 child process 先於父程序 parent process 退出,但是父程序沒有呼叫wait waitpid 子程序的資源,則子程序變成殭屍程序。但是如果該程序的父程序已經結束,那該程序就不會變成殭屍程序,因為每個程序結束的時候,系統會掃瞄所有執行中的程序,看看有...

避免殭屍程序

下面通過 為了觀察,完成同樣的功能,體會三種程序等待方式的區別。三種等待方式 1.wait waitpid 忽略sigchild訊號 忽略sigchild訊號只在linux下有效 2.wait只能進行阻塞等待,waitpid既可以用於阻塞等待,也可以用於非阻塞等待 waitpid 當waitpid的...

什麼是殭屍程序和孤兒程序?怎麼避免殭屍程序

孤兒程序 父程序退出,子程序還在執行的這些子程序都是孤兒程序,孤兒程序將被 init 程序 進 程號為 1 所收養,並由 init 程序對它們完成狀態收集工作。殭屍程序 程序使用 fork 建立子程序,如果子程序退出,而父程序並沒有呼叫 wait 或 waitpid 獲 取子程序的狀態資訊,那麼子程...