linux 程序等待 wait waitpid

2021-09-07 12:06:12 字數 2733 閱讀 6413

waitpid() 與 wait() 功能相似,都是使用者主程序等待子程序結束或中斷. 可用於程序之間的同步

wait 函式原型

pid_t wait(int

*status);

函式說明

wait() 會臨時停止眼下程序的執行,直到有訊號來到或子程序結束.假設在呼叫wait() 時子程序已經結束,則 wait() 會立即返回子程序結束狀態值.子程序的結束狀態值會由引數 status 返回,而子程序的程序識別碼也會一塊返回.假設不在意結束狀態值,則引數ststus能夠設為 null.子程序的結束狀態值請參考以下的waitpid().

返回值

假設執行成功則返回子程序識別碼(pid), 假設有發生錯誤則返回 -1, 失敗原因存於 errno 中.

演示樣例**:

#include 

#include

#include

#include

#include

int main(int argc, char *ar**)

else

return

0;}

waitpid 函式原型

pid_t waitpid(pid_t pid, int

*status, int options);

函式說明

waitpid() 會臨時停止眼下程序的執行,直到有訊號來到或子程序結束. 假設在呼叫 waitpid() 時子程序已經結束,則 waitpid() 會立即返回子程序結束狀態值. 子程序的結束狀態值會由引數 status 返回,而子程序的程序識別碼也會一塊返回.假設不在意結束狀態值,則引數ststus能夠設為null.引數pid為欲等待的子程序識別碼.其數值意義例如以下:

pid > 0 時,僅僅等待程序id等於pid的子程序,無論其他已經有多少子程序執行結束退出,僅僅要指定的子程序還沒有結束,waitpid就會一直等下去.

pid = -1 時,等待不論什麼乙個子程序退出,沒有不論什麼限制,此時 waitpid 和 wait 的作用一模一樣.

pid = 0 時,等待統一程序組中的不論什麼子程序,假設子程序已經增加了別的程序組,waitpid 不會對它做不論什麼理睬.

pid < -1 時, 等待乙個指定程序組中的不論什麼子程序,這個程序組的id等於pid的絕對值。

引數 options 的值有以下幾種型別:

wnohang 假設沒有不論什麼已經結束的子程序則立即返回, 不予以等待。  

wuntraced 假設子程序進入暫停運**況則立即返回,但結束狀態不予以理會。

假設不用以上兩個巨集。還能夠用 0 作為第三個引數傳入。

注: wait() 函式就是經過包裝的 waitpid(),檢視 《核心源**資料夾》/include/unistd.h 檔案 就能夠看到例如以下程式段

static inline pid_t wait(int

*wait_stat)

返回值

當正常返回的時候 waitpid 返**集到的子程序的id;

假設設定了 wnohang, 而呼叫中waitpid 發現沒有已退出的子程序可收集,則返回0;

假設呼叫**錯,則返回-1,並重置errno的值。

子程序的結束狀返回後存於 status,地下有幾個巨集可判別結束情況

wnohang 假設沒有不論什麼已經結束的子程序則立即返回, 不予以等待。

wuntraced 假設子程序進入暫停運**況則立即返回,但結束狀態不予以理會。

子程序的結束狀態返回後存於 status,底下有幾個巨集可判別結束情況:  

wifexited(status)假設子程序正常結束則為非 0 值。  

wexitstatus(status)取得子程序 exit()返回的結束**,通常會先用

wifexited 來推斷是否正常結束才幹使用此巨集。  

wifsignaled(status)假設子程序是由於訊號而結束則此巨集值為真  

wtermsig(status) 取得子程序因訊號而中止的訊號**,通常會先用 wifsignaled 來推斷後才使用此巨集。  

wifstopped(status) 假設子程序處於暫停運**況則此巨集值為真。

一般僅僅有使用 wuntraced 時才會有此情況。  

wstopsig(status) 取得引發子程序暫停的訊號**,通常會先用 wifstopped 來推斷後才使用此巨集。

演示樣例**:

#include 

#include

#include

#include

#include

main()

do } while(pr==0);

if(pr==pc)

printf("successfully get child %d\n", pr);

else

printf("some error occured\n");

}

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...