Linux 孤兒程序和殭屍程序 淺見

2022-08-30 01:36:08 字數 2161 閱讀 4081

孤兒程序與殭屍程序

什麼是孤兒程序、殭屍程序

1) 孤兒程序

父程序先結束,則其子程序變成「孤兒程序」。

變成孤兒程序之後,該程序由init接管並清理(認init作為父程序)

例項:main1.c

2) 殭屍程序

子程序結束後的狀態,取決於該子程序結束時,其父程序的狀態:

如果子程序結束時,其父程序還沒有結束,而其父程序沒有在執行waitpid或者wait(parm1), 則該子程序變成殭屍程序。

注意:事實上,即使子程序結束時,父程序正在執行wait(),也只能達到同步效果(父程序等待子程序結束後才不再阻塞)

該子程序仍將處於殭屍狀態。直到該殭屍程序的父程序結束,從而該殭屍程序變成孤兒程序,再由init接管並**。

子程序變成殭屍程序後,直到父程序呼叫waitpid**該子程序。

子程序變成殭屍程序後,如果直到父程序結束,該父程序都沒有呼叫waitpit,

則當該父程序結束後,該殭屍程序變成孤兒程序,再由init接管並**。

處於殭屍狀態的程序,不能用kill -9殺死!

例項: main2_1.c

main2_2.c (直接使用wait(), 不能**殭屍程序)

3) 孤兒程序與殭屍程序的影響

殭屍程序會占用系統資源(在程序表占用乙個程序表項),如果很多,則會嚴重影響伺服器的效能

孤兒程序不會占用系統資源,對系統無影響(它將被init程序接管並清理)

4) 孤兒程序的避免

方法1: 父程序使用waitpid

當父程序還沒有執行waitpid或者wait(param1)時,

子程序持續維持殭屍狀態。

直到父程序執行waitpid或者wait(param1)

main5.c

缺點:使用wait和waitpid時將阻塞父程序
方法2: 在父程序中捕捉sigchld訊號(子程序結束時,產生該訊號)

然後在該訊號的處理函式中(自定義)使用wait或waitpid

main3.c

方法3:呼叫兩次fork, 用孫子程序執行原子程序的任務,遠來的子程序馬上結束。

使得,孫子程序成為孤兒程序。

注意,需要在主程序中**子程序,否則子程序又變成殭屍程序。

main4.c

方法4:訊號處理

main1.c

#include 

#include

#include

#include

int main(void)

else

if (pd == 0) else

}

main2_1.c

#include 

#include

#include

#include

int main(void)

else

if (pd == 0) else

}

main2_2.c

#include 

#include

#include

#include

int main(void)

else

if (pd == 0) else

}

main3.c

#include 

#include

#include

#include

static

void sig_child_handler(int sig)

int main(void)

else

if (pd == 0) else

}

main4.c

#include 

#include

#include

#include

int main(void)

else

if (pd == 0) else

if (pd == 0) else

} else

}

Linux殭屍程序和孤兒程序

程式執行到結尾的時候,有兩種情況。子程序先退出,或者父程序先退出。如果父程序先退出的話,那麼子程序就會變成孤兒程序,最後被init接管,我們來看乙個例子。我們可以看到子程序的父程序變成了init,孤兒程序並不可怕,它們最後會被統一銷毀。但是如果子程序先退出呢?子程序先退出有兩種情況 1.呼叫wait...

殭屍程序和孤兒程序

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

殭屍程序和孤兒程序

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