一 . 殭屍程序: 子程序退出,父程序沒有**子程序資源(pcb),則子程序變成殭屍程序
處理殭屍程序的方法:wait 和 waitpid
呼叫wait和waitpid不僅可以獲得子程序的終止資訊,還可以使父程序阻塞等待子程序終止,起到程序間同步的作用。
1. waitpid的原型:
#include #include pid_t waitpid(pid_t pid,int *status,int options)第乙個引數pid :
引數值說明
pid<-1
等待程序組號為pid絕對值的任何子程序。
pid=-1
等待任何子程序,此時的waitpid()函式就退化成了普通的wait()函式。
pid=0
等待程序組號與目前程序相同的任何子程序,也就是說任何和呼叫waitpid()函式的程序在同乙個程序組的程序。對已經加入了別的程序組子程序不理睬
pid>0
等待程序號為pid的子程序。
第二個引數 int* status:獲取子程序的退出狀態,不關心可以置為null巨集說明
wifexited(status)
如果子程序正常結束,它就返回真;否則返回假。
wexitstatus(status)
如果wifexited(status)為真,則可以用該巨集取得子程序exit()返回的結束**。
wifsignaled(status)
如果子程序因為乙個未捕獲的訊號而終止,它就返回真;否則返回假。
wtermsig(status)
如果wifsignaled(status)為真,則可以用該巨集獲得導致子程序終止的訊號**。
wifstopped(status)
如果當前子程序被暫停了,則返回真;否則返回假。
wstopsig(status)
如果wifstopped(status)為真,則可以使用該巨集獲得導致子程序暫停的訊號**。
例如:
if(wifexited(status))第三個引數:int opotion
引數說明
wnohang
設為非阻塞
wuntraced
如果子程序進入暫停狀態,則馬上返回。
返回值:
如果waitpid()函式執行成功,則返回子程序的程序號;
如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0;
如果有錯誤發生,則返回-1,並且將失敗的原因存放在errno變數中。
失敗的原因主要有:沒有子程序或此程序存在,但不是呼叫程序的子程序(errno設定為echild),呼叫被某個訊號中斷(errno設定為eintr)或選項引數無效(errno設定為einval)
2. wait:阻塞函式 ,相當於waitpid(-1, status, 0)
原型:
#include #include pid_t wait(int *status)返回值:
如果成功,wait會返回被收集的子程序的程序id。
如果呼叫程序沒有子程序,呼叫就會失敗,此時wait返回-1,同時errno被置為echild。
我們知道乙個程序的退出狀態可以在shell中用特殊變 量$?檢視,因為shell是它的父程序,當它終止時shell呼叫wait或waitpid得到它的退出狀態同時徹底清除掉這個程序。
二 . 孤兒程序: 父程序先於子程序結束,則子程序成為孤兒程序,子程序的父程序成為1號 程序init程序,稱為init程序領養孤兒程序
處理孤兒程序:kill(pid_t,signal_no);
1.通過kill檢視父程序是否終止
2.殺死乙個程序組
組長的終止不會終止程序組。程序組的終止直到程序組的最後乙個程序終止或轉移走。
殭屍程序和孤兒程序
殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...
殭屍程序和孤兒程序
什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...
殭屍程序和孤兒程序
殭屍程序和孤兒程序 在unix系統程式設計中,常常會碰到兩個概念 僵死程序和孤兒程序 僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取...