孤兒程序與殭屍程序
什麼是孤兒程序、殭屍程序
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秒後查詢其程序資訊 通過上...