父程序子程序結束不同步發生的問題:孤兒程序和殭屍程序
當父程序和子程序退出不同步的時候,會發生兩種情況
1.父程序先退出,子程序未退出,被領養
此時,子程序將被init初始程序領養。如下面的**:
a.c
#include#include#includeint main()else
return 0;
}
輸出:parent pid is:2927 ,child pid is:2928
ps -aux檢視該程序狀態,
lsx 2928 0.0 0.0 2356 76 pts/0 s 11:38 0:00 ./a
此時只有乙個./a程序,父程序已經退出 子程序依舊在執行,且執行狀態為s,斌不是殭屍程序。
2.子程序先退出,父程序依舊執行,則子程序變為殭屍程序
#include#include#includeint main()else
return 0;
}
輸出結果是:
parent pid is:1784 ,child pid is:1785
child died
使用ps -aux檢視程序
lsx 1784 0.0 0.0 2488 516 pts/0 s+ 12:45 0:00 ./a 父程序依舊執行
lsx 1785 0.0 0.0 0 0 pts/0 z+ 12:45 0:00 [a] 子程序為殭屍程序z+
避免殭屍程序
讓殭屍程序的父程序來**,父程序每隔一段時間來查詢子程序是否結束並**,呼叫wait()或者waitpid(),通知核心釋放殭屍程序。採用訊號sigchld通知處理,並在訊號處理程式中呼叫wait函式。讓殭屍程序成為孤兒程序,由init程序**。
孤兒程序以及殭屍程序總結
我們知道在unix linux中,正常情況下,子程序是通過父程序建立的,子程序在建立新的程序。子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法 子程序 到底什麼時候結束。當乙個 程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取得子程序的終止狀態。孤兒程...
Linux 殭屍程序
怎樣產生殭屍程序的 乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫 exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀 在linux程序的狀態中,殭屍程序是非常特殊的...
linux殭屍程序
僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取得子程序的終止狀態。如果父程序沒有這麼做的話,子程序雖然已經退出了,但是在系統程序表中...