天天看點

_exit和exit的差別

在linux的标準庫函數中,有一套稱作進階I/O的函數,我們熟知的printf 、fopen 、fread 、fwrite都在此列,他們也被稱作緩沖I/O。其特征是對應每一個打開的檔案,都存在一個緩沖區, 在記憶體中都有一片緩沖區,每次讀檔案會多讀若幹條記錄,這樣下次讀檔案時就可以直接從記憶體的緩存中取出,每次寫檔案時也僅僅是寫入到記憶體的緩沖區,等待滿足一定的條件(達到一定的數量,或者遇到特定字元,如換行和檔案結束符EOF),再将緩沖區的内容一次性的寫入檔案,這樣就大大增加了檔案讀寫的速度,但也為我們程式設計帶來了一點點麻煩,如果有些資料,我們認為已經寫入了檔案,實際上因為沒有滿足特定的條件,他們還隻是儲存在緩沖區内,這時我們用_exit函數直接将程式關閉,緩沖區中的資料就會丢失,反之,如果向保證資料的完整性,就一定要使用exit函數。

exit()函數與_exit()函數最大的差別就在于exit()函數在調用exit系統調用之前要檢查檔案的打開情況,把檔案緩沖區中的内容寫回檔案,就是圖中的"清理I/O緩沖"一項。

exit()函數定義在stdlib.h中,而_exit()定義在unistd.h中。exit()和_exit()都用于正常終止一個函數。但_exit()直接是一個sys_exit系統調用,而exit()則通常是普通函數庫中的一個函數。它會先執行一些清除操作,例如調用執行各終止處理函數、關閉所有标準IO等,然後調用sys_exit。

    比如:

int main()

{ printf("this is a test function!!!/n")

 printf("test exit ");

 exit(0);

}

int main()

{ printf("this is a test function!!!/n")

 printf("test exit");

 _exit(0);

}

這兩個程式,程式1輸出的是兩句話,而程式2隻輸出了一句話。原因就是因為最後一句話上沒有加上特殊的字元,如換行和檔案結束符,因為這個時候檔案是存放在緩沖區的,這個例子中檔案就是存放打開的顯示裝置的緩沖區中的,因為輸出函數要寫入,首先要進行系統調用,這個時候系統會打開顯示裝置的緩沖區,而exit的作用就是結束,清理,就是說先檢查緩沖區,把沒有寫入的資料寫入到檔案,而_exit是立刻關閉檔案,檔案緩沖區的内容也就消失了,這個時候就不可能再輸出到顯示裝置了。

繼續閱讀