子程序是通過父程序建立的,子程序也可以繼續建立子程序。父程序無法**子程序到底什麼時候結束,當乙個子程序結束之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態。
殭屍程序 :
子程序結束了,但是父程序沒有呼叫wait()或者waitpid()取得子程序的終止狀態,這個子程序將變成乙個殭屍程序。
利用命令ps,可以看到有標記為z的程序就是殭屍程序。
殭屍程序危害:
系統中的程序數量是有限的,雖然殭屍程序占用的資源和記憶體都比較少,但是它卻占領著數字,可能會導致系統無法再建立新的程序,因此及時清除殭屍程序很重要!
避免殭屍程序:
1、通過訊號機制,子程序退出時向父程序傳送sigchild訊號,父程序處理sigchild訊號。在訊號處理函式中呼叫wait進行處理殭屍程序。
兩次fork()
原理是將子程序成為孤兒程序,從而其的父程序變為init程序,通過init程序可以處理殭屍程序。
處理殭屍程序:
把父程序殺掉。父程序死後,殭屍程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理殭屍程序。它產生的所有殭屍程序也跟著消失。
構造殭屍程序,子程序退出,父程序未退出,未wait
#include
#include
#include
int main (
)else
return0;
}
使用訊號解決
#include
#include
#include
#include
#include
#include
void
sig_child
(int signo)
int main (
)else
return0;
}
兩次fork解決,第二個子程序為孤兒程序
#include
#include
#include
#include
#include
int main (
)else
if(fpid ==0)
else
}else
exit(0
);}return0;
}
孤兒程序:父程序先與子程序結束,子程序就由init(程序號為1)來接管他,成為他的父程序,此時稱這個程序為孤兒程序,其狀態收集工作由init程序負責。
孤兒程序並不會有什麼危害。
構造孤兒程序,父程序退出,子程序未退出
#include
#include
int main (
)else
return0;
}
守護程序(daemon)是在一類脫離終端在後台執行的程式, 通常以 d 結尾, 隨系統啟動, 其父程序 (ppid) 通常是 init 程序。 Linux殭屍程序和孤兒程序
程式執行到結尾的時候,有兩種情況。子程序先退出,或者父程序先退出。如果父程序先退出的話,那麼子程序就會變成孤兒程序,最後被init接管,我們來看乙個例子。我們可以看到子程序的父程序變成了init,孤兒程序並不可怕,它們最後會被統一銷毀。但是如果子程序先退出呢?子程序先退出有兩種情況 1.呼叫wait...
殭屍程序和孤兒程序
殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...
殭屍程序和孤兒程序
什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...