|  | ||||||||
| exit()和_exit()函數 | ||||||||
| 1)exit()和_exit()函數說明 exit()和_exit()函(han)數都(dou)是用(yong)(yong)來終止(zhi)進(jin)程的(de)。當(dang)程序執行(xing)到exit()或_exit()時,進(jin)程會無條件(jian)地停止(zhi)剩下的(de)所(suo)(suo)有操作,清(qing)除各種數據結構(gou),并(bing)終止(zhi)本進(jin)程的(de)運(yun)行(xing)。但是,這兩(liang)個函(han)數還是有區別的(de),其調用(yong)(yong)過程如圖1所(suo)(suo)示。 
 從圖(tu)1中可以看出(chu),_exit()函(han)(han)數(shu)的(de)(de)作用(yong)是:直(zhi)接使進程停(ting)止運行,清(qing)除其(qi)使用(yong)的(de)(de)內(nei)存空間,并清(qing)除其(qi)在(zai)(zai)內(nei)核中的(de)(de)各種數(shu)據結構;exit()函(han)(han)數(shu)則在(zai)(zai)這些(xie)基礎(chu)上做了(le)一些(xie)包(bao)裝,在(zai)(zai)執行退出(chu)之前加了(le)若干道工序。exit()函(han)(han)數(shu)與_exit()函(han)(han)數(shu)大(da)的(de)(de)區別(bie)就(jiu)在(zai)(zai)于exit()函(han)(han)數(shu)在(zai)(zai)終(zhong)止當前進程之前要(yao)檢查(cha)該進程打開過(guo)哪些(xie)文(wen)件,把文(wen)件緩沖區中的(de)(de)內(nei)容寫回文(wen)件,也就(jiu)是圖(tu)3.5中的(de)(de)“清(qing)理(li)I/O緩沖”一項。 由于在Linux的標準函(han)數庫中,有一種被稱做“緩沖(chong)I/O(buffered I/O)”的操作,其特(te)征(zheng)就是對應每(mei)一個(ge)打開的文(wen)件,在內存中都有一片緩沖(chong)區(qu)。 每次(ci)(ci)讀(du)文(wen)件(jian)時,會連續讀(du)出若干(gan)條記錄,這樣在下次(ci)(ci)讀(du)文(wen)件(jian)時就可(ke)以(yi)直(zhi)接從內(nei)存的(de)緩(huan)沖(chong)(chong)區中讀(du)取;同樣,每次(ci)(ci)寫文(wen)件(jian)時,也僅僅是寫入(ru)內(nei)存中的(de)緩(huan)沖(chong)(chong)區,等滿足了一定的(de)條件(jian)(如(ru)達到(dao)(dao)一定數量或遇到(dao)(dao)特定字符(fu)等),再將緩(huan)沖(chong)(chong)區中的(de)內(nei)容一次(ci)(ci)性寫入(ru)文(wen)件(jian)。   這種技術大(da)(da)大(da)(da)增加(jia)了(le)文(wen)(wen)件讀寫的速度,但也為編(bian)程(cheng)帶來(lai)了(le)一些(xie)麻(ma)煩。比如(ru)有些(xie)數(shu)據(ju)認為已經被寫入到文(wen)(wen)件中,實際上因為沒有滿足特定的條件,它們還只(zhi)是被保存在(zai)緩沖區(qu)內,這時用(yong)_exit()函(han)數(shu)直接(jie)將(jiang)進程(cheng)關閉掉,緩沖區(qu)中的數(shu)據(ju)就會丟失。因此(ci),若想保證數(shu)據(ju)的完整性(xing),好使用(yong)exit()函(han)數(shu)。 2)exit()和_exit()函數語法 表1列(lie)出了exit()和_exit()函數的語(yu)法(fa)要點。 表1 exit()和_exit()函數語法要點 
 3)exit()和_exit()使用實例 以(yi)下兩個(ge)示(shi)(shi)例比較了exit()和_exit()函數(shu)(shu)的(de)區(qu)別(bie)。由于printf()函數(shu)(shu)使(shi)用(yong)的(de)是緩沖I/O方式,該函數(shu)(shu)在遇到“\n”換行(xing)符時自動(dong)從(cong)緩沖區(qu)中將記錄(lu)讀出。以(yi)下示(shi)(shi)例中就是利用(yong)這個(ge)性質來進行(xing)比較的(de)。示(shi)(shi)例1的(de)代(dai)碼如下:     /* exit.c */   讀者從輸出的結果(guo)中可以看到(dao),調用exit()函數時,緩沖區中的記錄也能(neng)正常輸出。 示(shi)例2的(de)代碼如下:     /* _exit.c */ 讀(du)者從后的結果(guo)中可(ke)以(yi)看到,調用(yong)_exit()函數無法輸出(chu)緩沖區中的記錄(lu)。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接(jie): 
         1、Linux下多進程編程之exec函數語法及使用實例 |