wait和waitpid函式詳解

2021-06-20 01:53:45 字數 3286 閱讀 8019

wait的函式原型是:  

#include

#include

pid_t wait(int *status)     

程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是

否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個

已經變成殭屍的子程序, wait就會收集這個子程序的資訊,並

把它徹底銷毀後返回;如果沒有找到這樣乙個子程序,wait就

會一直阻塞在這裡,直到有乙個出現為止。    

引數status用來儲存被收集程序退出時的一些狀態,它是

乙個指向int型別的指標。但如果我們對這個子程序是如何死掉

的毫不在意,只想把這個殭屍程序消滅掉,(事實上絕大多數

情況下,我們都會這樣想),我們就可以設定這個引數為

null,就象下面這樣:     pid = wait(null);

如果成功,wait會返回被收集的子程序的程序id,如果呼叫進

程沒有子程序,呼叫就會失敗,此時wait返回-1,同時errno被

置為echild。 

waitpid的函式原型是:   

waitpid系統呼叫在linux函式庫中的原型是:   

#include #include

pid_t waitpid(pid_t pid,int *status,int options)

從本質上講,系統呼叫waitpid和wait的作用是完全相同

的,但waitpid多出了兩個可由使用者控制的引數pid和options,

從而為我們程式設計提供了另一種更靈活的方式。

下面我們就來詳細介紹一下這兩個引數:     

● pid     從引數的名字pid和型別pid_t中就可以看出,

這裡需要的是乙個程序id。但當pid取不同的值時,在這裡有不

同的意義。     pid>0時,只等待程序id等於pid的子進

程,不管其它已經有多少子程序執行結束退出了,只要指定的

子程序還沒有結束,waitpid就會一直等下去。     pid=-

1時,等待任何乙個子程序退出,沒有任何限制,此時waitpid

和wait的作用一模一樣。     pid=0時,等待同乙個程序

組中的任何子程序,如果子程序已經加入了別的程序組,

waitpid不會對它做任何理睬。     pid<-1時,等待乙個

指定程序組中的任何子程序,這個程序組的id等於pid的絕對

值。   

● options   options提供了一些額外的選項來控制waitpid,

目前在linux中只支援wnohang和wuntraced兩個選項,

這是兩個常數,可以用"|"運算子把它們連線起來使用,比如:

ret=waitpid(-1,null,wnohang | wuntraced);   

如果我們不想使用它們,也可以把options設為0,如:   

ret=waitpid(-1,null,0);     如果使用了wnohang引數

呼叫waitpid,即使沒有子程序退出,它也會立即返回,不會像

wait那樣永遠等下去。     而wuntraced引數,由於

涉及到一些跟蹤除錯方面的知識,加之極少用到,這裡就不多

費筆墨了,有興趣的讀者可以自行查閱相關材料。    看

到這裡,聰明的讀者可能已經看出端倪了--wait不就是經過包裝

的waitpid嗎?沒錯,察看《核心原始碼目錄》/include/unistd.h文

件349-352行就會發現以下程式段:     static inline

pid_t wait(int * wait_stat)         返回值和錯誤     

waitpid的返回值比wait稍微複雜一些,一共有3種情況:  

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

● 如果設定了選項wnohang,而呼叫中waitpid發現沒有已

退出的子程序可收集,則返回0;      

● 如果呼叫中出錯,則返回-1,這時errno會被設定成相應的

值以指示錯誤所在;當pid所指示的子程序不存在,或此程序存

在,但不是呼叫程序的子程序,waitpid就會出錯返回,這時

errno被設定為echild 其它: 呼叫 wait&waitpid 來處理終止

的子程序: pid_t wait(int * statloc); pid_t waitpid(pid_t pid,

int *statloc, int options); 兩個函式都返回兩個值:函式的返回

值和終止的子程序id,而子程序終止的狀態則是通過statloc指

針返回的。 wait&waitpid 的區別是顯而易見的,wait等待第一

個終止的子程序,而waitpid則可以指定等待特定的子程序。這

樣的區別可能會在下面這種情況時表現得更加明顯:當同時有

5個客戶連上伺服器,也就是說有五個子程序分別對應了5個客

戶,此時,五個客戶幾乎在同時請求終止,這樣一來,幾乎同

時,五個fin發向伺服器,同樣的,五個sigchld訊號到達服

務器,然而,unix的訊號往往是不會排隊的,顯然這樣一來,

訊號處理函式將只會執行一次,殘留剩餘四個子程序作為殭屍

程序駐留在核心空間。此時,正確的解決辦法是利用waitpid(-

1, &stat, wnohang)防止留下殭屍程序。其中的pid為-1表

明等待第乙個終止的子程序,而wnohang選擇項通知核心在

沒有已終止程序項時不要阻塞。

wait&waitpid 區別 :

waitpid提供了wait函式不能實現的3個功能: waitpid等待特定的

子程序, 而wait則返回任一終止狀態的子程序; waitpid提供了一

個wait的非阻塞版本; waitpid支援作業控制(以wuntraced選

項). 用於檢查wait和waitpid兩個函式返回終止狀態的巨集: 這兩個

函式返回的子程序狀態都儲存在statloc指標中, 用以下3個巨集可

以檢查該狀態: wifexited(status): 若為正常終止, 則為真. 此

時可執行 wexitstatus(status): 取子程序傳送給exit或_exit

引數的低8位. wifsignaled(status): 若為異常終止, 則為真.

此時可執行 wtermsig(status): 取使子程序終止的訊號編號.

wifstopped(status): 若為當前暫停子程序, 則為真. 此時可

執行 wstopsig(status): 取使子程序暫停的訊號編號

wait函式和waitpid函式

1.殭屍程序 說明子程序結束但是沒有完全釋放記憶體 在核心中的task struct沒有釋放 該程序就會成為殭屍程序 當殭屍程序的父程序結束後就會被init程序 1號程序 接管,最終被 殭屍程序的危害 如果你不處理殭屍程序的話,那麼保留的那段資訊就不會釋放,其程序號就會一定被占用,但是系統所能使用的...

wait函式和waitpid函式

1 wait函式 當乙個程序結束時,會關閉所有的檔案描述符,釋放所有的記憶體空間,但依然儲存其pcb,核心在pcb中儲存著一些資訊。如果是正常退出,則會儲存退出狀態。如果是異常終止,則儲存是哪個訊號終止了該程序。父程序通過呼叫wait 或者waitpid 函式,來獲取這些資訊,之後徹底清除改程序。只...

wait和 wait pid函式用法

wait和 wait pid函式用法 wait的函式原型是 i nclude 提供型別pid t的定義 i nclude pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序...