程式設計過程中,有時需要讓乙個程序等待另乙個程序,最常見的是父程序等待自己的子程序,或者父程序**自己的子程序資源包括殭屍程序。這裡簡單介紹一下系統呼叫函式:wait()
函式原型是
#include
#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,這個值就毫無意義。
linux之父子程序的輸出
首先,我們來回憶一下父程序與子程序,前幾節講了如何建立子程序,像這樣的,pid t id fork 這樣我們就建立好了乙個子程序,然而fork 函式的返回值是什麼呢?這裡要記住 子程序返回0,父程序返回子程序的pid,如果建立失敗的話就返回 1.由於是父程序建立的子程序,那麼子程序就繼承自父程序。比...
Linux系統程式設計之mmap實現父子程序通訊
原理 在映 對映區之後,父子都可以拿到對映的記憶體區域的記憶體位址,如果乙個程序改變了記憶體區域的內容,另外乙個去讀的時候會有變化。先建立對映區在fork 所以,應該先建立對映區再fork。include include include include include include include...
Linux中父子程序之間的通訊
在linux系統中實現父子程序的通訊可以採用pipe 和fork 函式進行實現。利用兩個管道在父子程序之間進行通訊如 1 include2 include3 include4 include5 include 6int main void 23 24 pid fork 25if 1 pid 此處為了...