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()
int main()
這兩個程式,程式1輸出的是兩句話,而程式2只輸出了一句話。原因就是因為最後一句話上沒有加上特殊的字元,如換行和檔案結束符,因為這個時候檔案是存放在緩衝區的,這個例子中檔案就是存放開啟的顯示裝置的緩衝區中的,因為輸出函式要寫入,首先要進行系統呼叫,這個時候系統會開啟顯示裝置的緩衝區,而exit的作用就是結束,清理,就是說先檢查緩衝區,把沒有寫入的資料寫入到檔案,而_exit是立刻關閉檔案,檔案緩衝區的內容也就消失了,這個時候就不可能再輸出到顯示裝置了。
exit函式和 exit函式的區別
在談論exit函式與 exit函式之前,我們先了解一下他們的使用場景,他們是在程序終止中使用的,那什麼是程序終止呢?程序終止的場景 1 執行完畢,結果正確 即就是程序中的所有 都已執行完畢,而且執行結果也是你想要得到的,就像司馬懿的一生,順順利利的結束,實現了自己的人生理想,最後也成為了千古名人 2...
exit函式和 exit函式之間的區別
include include include include int main else return 0 這是別人的例項 我借用一下哈 這裡說明一下,printf是標準io函式,當遇到 n換行符的時候,才會將緩衝區裡面的內容進行輸出 執行結果是 this is exit test this is...
exit和exit的區別?
exit終止呼叫程序,但不關閉檔案,不清除輸出快取,也不呼叫出口函式。exit函式將終止呼叫程序。在退出程式之前,所有檔案關閉,緩衝輸出內容 將重新整理定義,並呼叫所有已重新整理的 出口函式 由atexit定義 作為系統呼叫而言,exit和exit是一對孿生兄弟,它們究竟相似到什麼程度,我們可以從l...