|  | ||||||||||||||||||||||||||||||||||
| wait()和waitpid()函數 | ||||||||||||||||||||||||||||||||||
| 1)wait()和waitpid()函數說明 wait()函數用于使(shi)父進(jin)程(cheng)(cheng)(cheng)(也就是調用wait()的(de)進(jin)程(cheng)(cheng)(cheng))阻塞,直到(dao)一(yi)個子進(jin)程(cheng)(cheng)(cheng)結束(shu)或者該進(jin)程(cheng)(cheng)(cheng)接收到(dao)了一(yi)個指定(ding)的(de)信號為止。如果該父進(jin)程(cheng)(cheng)(cheng)沒有(you)子進(jin)程(cheng)(cheng)(cheng)或者它的(de)子進(jin)程(cheng)(cheng)(cheng)已經結束(shu),則wait()就會立即(ji)返(fan)回。   waitpid()的(de)(de)(de)作用和(he)wait()一(yi)(yi)(yi)樣,但它(ta)并不一(yi)(yi)(yi)定要等(deng)待第(di)一(yi)(yi)(yi)個(ge)終止的(de)(de)(de)子進程,它(ta)還有若干選項,如可(ke)提供(gong)一(yi)(yi)(yi)個(ge)非阻塞版本(ben)的(de)(de)(de)wait()功能(neng),也能(neng)支持(chi)作業(ye)控制。實際上,wait()函(han)數只是waitpid()函(han)數的(de)(de)(de)一(yi)(yi)(yi)個(ge)特例(li),在Linux內部實現wait()函(han)數時(shi)直(zhi)接調(diao)用的(de)(de)(de)就(jiu)是waitpid()函(han)數。 2)wait()和waitpid()函數格式說明   表(biao)1列出了wait()函(han)數的語法要點。 表1 wait()函數語法(fa)要點 
   表2列(lie)出(chu)了waitpid()函(han)數的(de)語法要點(dian)。 表(biao)2 waitpid()函數語法要點 
 3)waitpid()使用實例 由于wait()函數的(de)使(shi)(shi)(shi)用(yong)較(jiao)為(wei)簡單,在此僅以waitpid()為(wei)例(li)進(jin)行講解。本例(li)中(zhong)首先使(shi)(shi)(shi)用(yong)fork()創(chuang)建一(yi)個子進(jin)程(cheng)(cheng),然后讓其子進(jin)程(cheng)(cheng)暫(zan)停5s(使(shi)(shi)(shi)用(yong)了sleep()函數)。接下來(lai)對原有的(de)父(fu)(fu)進(jin)程(cheng)(cheng)使(shi)(shi)(shi)用(yong)waitpid()函數,并使(shi)(shi)(shi)用(yong)參數WNOHANG使(shi)(shi)(shi)該(gai)父(fu)(fu)進(jin)程(cheng)(cheng)不會阻塞。若有子進(jin)程(cheng)(cheng)退出(chu),則(ze)waitpid()返回子進(jin)程(cheng)(cheng)號(hao);若沒有子進(jin)程(cheng)(cheng)退出(chu),則(ze)waitpid()返回0,并且父(fu)(fu)進(jin)程(cheng)(cheng)每隔1s循環判斷一(yi)次(ci)。該(gai)程(cheng)(cheng)序的(de)流程(cheng)(cheng)圖(tu)如圖(tu)1所示。 
 該程序源代(dai)碼如下:     /* waitpid.c */ 將該程(cheng)序交(jiao)叉編譯(yi),下載到目標板后的運行結果(guo)如(ru)下:     $ ./waitpid 可(ke)見,該(gai)程序在經過5次循環(huan)后,捕獲(huo)到了(le)子進程的退(tui)出信(xin)號,具體的子進程號在不同的系統上會有所區別。 讀(du)者(zhe)還可以嘗試(shi)把“pr = waitpid(pc, NULL, WNOHANG);”改為(wei)“pr = waitpid(pc, NULL, 0);”或者(zhe)“pr = wait(NULL);”,運行的(de)結果為(wei):     $ ./waitpid 可(ke)見,在上(shang)述兩(liang)種情況下,父進程在調(diao)用waitpid()或wait()之后(hou)就將自(zi)己阻塞,直(zhi)到有(you)子進程退出為止。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接(jie):  
         1、exit()和_exit()函數 | ||||||||||||||||||||||||||||||||||