![]() |
||||||||
exit()和_exit()函數 |
||||||||
1)exit()和_exit()函數說明 exit()和_exit()函數都是用來終止進程的。當程序執行到exit()或_exit()時,進程會無條件地停止剩下的所有操作,清除各種數據結構,并終止本進程的運行。但是,這兩個函數還是有區別的,其調用過程如圖1所示。
從圖1中可以看出,_exit()函數的作用是:直接使進程停止運行,清除其使用的內存空間,并清除其在內核中的各種數據結構;exit()函數則在這些基礎上做了一些包裝,在執行退出之前加了若干道工序。exit()函數與_exit()函數大的區別就在于exit()函數在終止當前進程之前要檢查該進程打開過哪些文件,把文件緩沖區中的內容寫回文件,也就是圖3.5中的“清理I/O緩沖”一項。 由于在Linux的標準函數庫中,有一種被稱做“緩沖I/O(buffered I/O)”的操作,其特征就是對應每一個打開的文件,在內存中都有一片緩沖區。 每次讀文件時,會連續讀出若干條記錄,這樣在下次讀文件時就可以直接從內存的緩沖區中讀取;同樣,每次寫文件時,也僅僅是寫入內存中的緩沖區,等滿足了一定的條件(如達到一定數量或遇到特定字符等),再將緩沖區中的內容一次性寫入文件。 這種技術大大增加了文件讀寫的速度,但也為編程帶來了一些麻煩。比如有些數據認為已經被寫入到文件中,實際上因為沒有滿足特定的條件,它們還只是被保存在緩沖區內,這時用_exit()函數直接將進程關閉掉,緩沖區中的數據就會丟失。因此,若想保證數據的完整性,好使用exit()函數。 2)exit()和_exit()函數語法 表1列出了exit()和_exit()函數的語法要點。 表1 exit()和_exit()函數語法要點
3)exit()和_exit()使用實例 以下兩個示例比較了exit()和_exit()函數的區別。由于printf()函數使用的是緩沖I/O方式,該函數在遇到“\n”換行符時自動從緩沖區中將記錄讀出。以下示例中就是利用這個性質來進行比較的。示例1的代碼如下: /* exit.c */ 讀者從輸出的結果中可以看到,調用exit()函數時,緩沖區中的記錄也能正常輸出。 示例2的代碼如下: /* _exit.c */ 讀者從后的結果中可以看到,調用_exit()函數無法輸出緩沖區中的記錄。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接:
1、Linux下多進程編程之exec函數語法及使用實例 |