》 乙個程序的退出可能是正常退出也可能是異常退出,程序的pcb則會記錄這些資訊:如果是正常退出則記錄退出轉台,若為異常退出,則記錄程序退出訊號。父程序可以通過呼叫wait或者waitpid來獲取這些資訊。
那麼父程序呼叫wait函式會發生什麼狀況呢?
1.如果其所有子程序還在執行,則導致阻塞
2.如果子程序已經終止,正在等待父程序獲取退出狀態,則可以獲取程序退出資訊並返回
3.若果沒有子程序,則出錯退出
所以wait函式就是,必須得子程序結束父程序才可以呼叫它,子程序就等著你來得到它的退出情況呢,如果子程序還沒執行完,你就急著來wait,那麼就會導致程序阻塞。
》 標頭檔案:
#include
#include
等待函式1. pid_t wait(int* status)成功返回子程序pid失敗返回-1 status獲取子程序的退出狀態,不關心則只置為null
$如果程序由於接收到了sigchild而呼叫wait函式,則可以期望wait會立即返回不會造成程序阻塞,否則,可能會造成呼叫程序阻塞
$若status不為空則子程序的退出狀態存放在它所指定的單元內,否則置為null就好
等待函式2. pid_t waitpid(pid_t pid,int* status,int options)
返回值分析:
1.當正常返回時,waitpid會得到子程序的pid
2.若設定了選項wnohang(未阻塞),沒有終止子程序可以收集則返回0
3、如果呼叫中出錯則返回-1,並且erron會設定成相應的值來指示錯誤的位置
4.如果pid所指示的子程序不存在或者子程序不是呼叫程序的子程序,則waitpid出錯返回,並且erron會置為echild
pid:
pid=-1:等待程序的任乙個子程序
pid>0:等待程序子程序id等於pid的程序
pid==0:等待其組id等於呼叫程序組id的任一程序
pid<-1:等待其組id等於pid絕對值的任一程序
status:
wifexited(status):若返回正常終止子程序的狀態則為真(檢視子程序是否正常退出)
wexitstatus:若wexitstatus非零,則提取子程序的退出碼
options:
wnohang :若pid指定的子程序沒有結束,則waitpid()函式返回0,不予以等待。
若正常結束,則返回該子程序的id。(程序是否阻塞)
wifexited(status) : 若為正常終止子程序返回的狀態,則為真。
// 舉例:1. 正常建立父子程序,子程序正常退出,父程序等待,並獲取退出狀態status。呼叫該巨集,檢視輸出結果(正常為非0,或1)。
2. 正常建立父子程序,子進
程pause(),父程序等待,並設定獲取退出狀態status,kill殺掉子程序。呼叫該巨集,檢視
輸出結果(結果為0)。(程序等待狀態是否正常)
wexitstatus(status) : 若wifexited非零,返回子程序退出碼,提取程序退出返回值,如果子程序返回
exit(7),wexitstatus(status)就會返回7.請注意,如果程序不是正常退出的,也就是說,wifexited返回0,這個值就毫無意義。(獲取程序退出碼)
LINUX 程序等待
wait 函式一般用在父程序中等待 子程序的資源,而防止殭屍程序的產生。什麼是殭屍程序?pid t wait int status 引數 status 是乙個整形指標。如果status不是乙個空指標,則終止程序的終止狀態將儲存在該指標所指向的記憶體單元中。如果不關心終止狀態,可以將 status引數...
Linux 程序等待
目錄 程序等待 程序等待的必要性 程序等待的方法 wait waitpid 引數int status 誰要等待?等待什麼?為什麼要等待 首先要知道程序終止或退出的時候會發生什麼,程序退出時會關閉所有檔案描述符,釋放在使用者空間分配的記憶體,但是pcb卻會暫時保留,裡面存著退出狀態,比如乙個程序正常退...
Linux 程序等待
阻塞等待 為了完成乙個功能發起呼叫,當前若不具備完成條件,等待直到條件具備完成功能後返回 非阻塞等待 為了完成乙個功能發起呼叫,當前若不具備完成條件,則立即報錯返回 wait方法 功能 阻塞等待 任意乙個子程序退出,獲取返回值 include include pid t wait int statu...