乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。
當乙個孤兒程序被一號程序收養的時候,一號程序會代替它的父程序管理它,在它完成自己的宣告週期後,一號程序會結束掉孤兒程序,所以沒有危害。
孤兒程序實現**:
#include
#include
#include
#include
int main(void)
else
if(pid == 0)//子程序
}else//父程序
這裡可以看到子程序3022的父程序本來是3021,但是由於父程序退出,子程序沒有退出,子程序變成了孤兒程序繼續執行,並且由1號程序領養,成為了1號程序的子程序。
乙個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。
如果程序不呼叫wait / waitpid的話, 那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。
使用ps -a -o stat,ppid,pid,cmd |grep a.out命令可以檢視a.out生成的殭屍程序,stat狀態為z或z的就是殭屍程序,這時候需要kill pid殺死殭屍程序。
實現**如下:
#include
#include
#include
#include
#include
int main(void)
else
if(pid == 0)//子程序
else
//父程序}}
此時程序3337就成為了殭屍程序,需要用kill 3337殺死殭屍程序。
殭屍程序和孤兒程序
殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...
殭屍程序和孤兒程序
什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...
殭屍程序和孤兒程序
殭屍程序和孤兒程序 在unix系統程式設計中,常常會碰到兩個概念 僵死程序和孤兒程序 僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取...