1、wait函式
當乙個程序結束時,會關閉所有的檔案描述符,釋放所有的記憶體空間,但依然儲存其pcb,核心在pcb中儲存著一些資訊。
如果是正常退出,則會儲存退出狀態。
如果是異常終止,則儲存是哪個訊號終止了該程序。
父程序通過呼叫wait()或者waitpid()函式,來獲取這些資訊,之後徹底清除改程序。
只有失敗返回值 -1 .
父程序呼叫wait函式可以**子程序終止資訊,該函式有三個功能:
① 阻塞等待子程序的退出
② **子程序的殘留資源
③ 獲取子程序的結束狀態(退出原因)
當乙個程序終止是,操作的系統的隱式**機制會
①關閉所有檔案描述符
②釋放使用者空間分配的記憶體,pcb仍然存在,並儲存改程序的退出狀態
wait使用傳出引數的status來儲存今後才能退出的狀態,進一步借用巨集函式判斷程序終止的原因。可分為如下三組
wifexited(status) 為非0 → 程序正常結束
wexitstatus(status) 如上巨集為真,
使用此巨集 → 獲取程序退出狀態 (exit的引數)
wifsignaled(status) 為非0 → 程序異常終止
wtermsig(status) 如上巨集為真,
使用此巨集 → 取得使程序終止的那個訊號的編號。
wifstopped(status) 為非0 → 程序處於暫停狀態
wstopsig(status) 如上巨集為真,
使用此巨集 → 取得使程序暫停的那個訊號的編號。
wifcontinued(status) 為真 → 程序暫停後已經繼續執行
#include
#include
#include
#include
intmain()
else
if(pid>0)
}if(wifexited
(status))if
(wifsignaled
(status)
)while(1
)}
作用等於wait,但是可以指定pid,也可以不阻塞。
pid_t waitpid
(pid_t pid,
int*status,
int options)
;
第乙個引數----->指定想要**的程序 pid
大於 0 **指定id的子程序第二個引數----->傳出的引數-1 **任意子程序(相當於wait)
0 **和當前呼叫waitpid乙個組的所有子程序 < -1 **指定程序組內的任意子程序
第三個引數------>選擇阻塞和不阻塞,設定為wnohang,且子程序正在執行,為非阻塞。
返回值:
成功:清理程序的pid
失敗: 返回-1
注意:一次wait或waitpid呼叫只能清理乙個子程序,清理多個子程序應使用迴圈。
示例:使用waitpid清理,指定pid的程序
Linux系統wait 和waitpid 函式
include include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒有找到這樣乙個子程序,wa...
wait函式和waitpid函式
1.殭屍程序 說明子程序結束但是沒有完全釋放記憶體 在核心中的task struct沒有釋放 該程序就會成為殭屍程序 當殭屍程序的父程序結束後就會被init程序 1號程序 接管,最終被 殭屍程序的危害 如果你不處理殭屍程序的話,那麼保留的那段資訊就不會釋放,其程序號就會一定被占用,但是系統所能使用的...
wait和 wait pid函式用法
wait和 wait pid函式用法 wait的函式原型是 i nclude 提供型別pid t的定義 i nclude pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序...