程式設計過程中,有時需要讓乙個程序等待另乙個程序,最常見的是父程序等待自己的子程序,或者父程序**自己的子程序資源包括殭屍程序。這裡簡單介紹一下系統呼叫函式:wait()
函式原型是
#include /* 提供型別pid_t的定義*/
#include int wait(int *status)
函式功能是:父程序一旦呼叫了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) 這個巨集用來指出子程序是否為正常退出的,如果是,它會返回乙個非零值。
(請注意,雖然名字一樣,這裡的引數status並不同於wait唯一的引數–指向整數的指標status,而是那個指標所指向的整數,切記不要搞混了。)
2, wexitstatus(status) 當wifexited返回非零值時,我們可以用這個巨集來提取子程序的返回值,如果子程序呼叫exit(5)退出,wexitstatus(status) 就會返回5;如果子程序呼叫exit(7),wexitstatus(status)就會返回7。請注意,如果程序不是正常退出的,也就是說, wifexited返回0,這個值就毫無意義。
**示例:wait.c
#include #include #include #include #include #include #include void waitprocess();
int main(int argc, char * ar**)
void waitprocess()
else if(pid>0)
else
exit(10); }
printf("child exit status is %d\n", wexitstatus(status)); //status是按位儲存的狀態資訊,需要呼叫相應的巨集來還原一下
printf("end of program from pid = %d\n", getpid());
}
執行結果:
Linux之程序等待
乙個程序的退出可能是正常退出也可能是異常退出,程序的pcb則會記錄這些資訊 如果是正常退出則記錄退出轉台,若為異常退出,則記錄程序退出訊號。父程序可以通過呼叫wait或者waitpid來獲取這些資訊。那麼父程序呼叫wait函式會發生什麼狀況呢?1.如果其所有子程序還在執行,則導致阻塞 2.如果子程序...
LINUX 程序等待
wait 函式一般用在父程序中等待 子程序的資源,而防止殭屍程序的產生。什麼是殭屍程序?pid t wait int status 引數 status 是乙個整形指標。如果status不是乙個空指標,則終止程序的終止狀態將儲存在該指標所指向的記憶體單元中。如果不關心終止狀態,可以將 status引數...
Linux 程序等待
目錄 程序等待 程序等待的必要性 程序等待的方法 wait waitpid 引數int status 誰要等待?等待什麼?為什麼要等待 首先要知道程序終止或退出的時候會發生什麼,程序退出時會關閉所有檔案描述符,釋放在使用者空間分配的記憶體,但是pcb卻會暫時保留,裡面存著退出狀態,比如乙個程序正常退...