Linux中的wait函式

2021-08-29 07:57:20 字數 1984 閱讀 2819

程式設計過程中,因為併發的前提,需要讓乙個程序等待另乙個程序,最常見的是父程序等待自己的子程序,或者父程序**自己的子程序資源包括殭屍程序。

當乙個程序結束時,會產生乙個終止狀態字,然後核心發出乙個sigchld訊號通知父程序。因為子程序的結束對於父程序是非同步的,然而這個sigchld訊號對於父程序也是非同步的,父程序可以不響應,也可呼叫函式wait() 和waitpid()函式進行處理。

這裡簡單介紹一下系統呼叫函式:wait(),waitpid()

函式原型是

#include

#include

int wait(int *status)

int wait(pid_t pid, int *statloc,int options)

呼叫以上兩個函式會出現三種情況:

1.如果所有子程序都正在執行,則呼叫該函式的程序掛起(因為沒有子程序結束,呼叫該函式的程序阻塞)

2.如果恰有子程序結束,它的終止狀態字等待父程序提取,立即得到該終止狀態字並返回,返回值為該字程序的程序號

3.如果該程序沒有子程序,立即返回,返回值為-1

函式功能是:父程序一旦呼叫了wait就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回;如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。

當父程序忘了用wait()函式等待已終止的子程序時,子程序就會進入一種無父程序的狀態,此時子程序就是殭屍程序.

wait()要與fork()配套出現,如果在使用fork()之前呼叫wait(),wait()的返回值則為-1,正常情況下wait()的返回值為子程序的pid.

如果先終止父程序,子程序將繼續正常進行,只是它將由init程序(pid 1)繼承,當子程序終止時,init程序捕獲這個狀態.

引數status用來儲存被收集程序退出時的一些狀態,它是乙個指向int型別的指標。但如果我們對這個子程序是如何死掉毫不在意,只想把這個殭屍程序消滅掉,(事實上絕大多數情況下,我們都會這樣想),我們就可以設定這個引數為null,就像下面這樣:

pid = wait(null);

如果成功,wait會返回被收集的子程序的程序id,如果呼叫程序沒有子程序,呼叫就會失敗,此時wait返回-1,同時errno被置為echild。

如果引數status的值不是null,wait就會把子程序退出時的狀態取出並存入其中, 這是乙個整數值(int),指出了子程序是正常退出還是被非正常結束的,以及正常結束時的返回值,或被哪乙個訊號結束的等資訊。由於這些資訊 被存放在乙個整數的不同二進位制位中,所以用常規的方法讀取會非常麻煩,人們就設計了一套專門的巨集(macro)來完成這項工作,下面我們來學習一下其中最常用的兩個:

1,wifexited(status) 這個巨集用來指出子程序是否為正常退出的,如果是,它會返回乙個非零值。

(請注意,wait()中的status是儲存返回結果的位址指標,這裡的status是指數值,雖然名字一樣,這裡的引數status並不同於wait唯一的引數–指向整數的指標status,而是那個指標所指向的整數,切記不要搞混了。)

2,wifsignaled(status) 當子程序異常結束時返回值為真

3, wexitstatus(status) 當wifexited返回非零值時,我們可以用這個巨集來提取子程序的返回值,如果子程序呼叫exit(5)退出,wexitstatus(status) 就會返回5;如果子程序呼叫exit(7),wexitstatus(status)就會返回7。請注意,如果程序不是正常退出的,也就是說, wifexited返回0,這個值就毫無意義。

4,wtermsig(status) 當wifsignaled(status)為真時呼叫,返回引起終止的訊號代號。 

使用:

#include#include#incldueint main()

else if(pid==0)else if(pid>0)

waitpid(pid_t pid,int *statloc,int options);

Linux下的exit函式和wait函式

exit函式 無論在程式中的什麼位置,只要執行到exit系統呼叫,程序就會停止剩下的所有操作,清除包括pcb在內的各種資料結構,並終止本程序的執行。如果乙個程序已經終止,而其父程序沒有對其進行處理 獲得終止資訊,釋放資源 那麼它將變成殭屍程序,在編寫長期執行的程式時,尤其要注意這一點。wait函式 ...

Linux中的wait系統呼叫

系統中的殭屍程序都要由wait系統呼叫來 下面就通過實戰看一看wait的具體用法 wait的函式原型是 include 提供型別pid t的定義 include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如...

linux中wait系統呼叫

系統中的殭屍程序都要由wait系統呼叫來 下面就通過實戰看一看wait的具體用法 wait的函式原型是 include 提供型別pid t的定義 include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經 退出,...