Linux 中_exit和exit的區(qū)別
Linux 中_exit和exit的區(qū)別
在Linux的標準庫函數中,有一套稱作高級I/O的函數,我們熟知的printf 、fopen 、fread 、fwrite都在此列,他們也被稱作緩沖I/O。其特征是對應每一個打開的文件,都存在一個緩沖區(qū), 在內存中都有一片緩沖區(qū),每次讀文件會多讀若干條記錄,這樣下次讀文件時就可以直接從內存的緩存中取出,每次寫文件時也僅僅是寫入到內存的緩沖區(qū),等待滿足一定的條件(達到一定的數量,或者遇到特定字符,如換行和文件結束符EOF),再將緩沖區(qū)的內容一次性的寫入文件,這樣就大大增加了文件讀寫的速度,但也為我們編程帶來了一點點麻煩,如果有些數據,我們認為已經寫入了文件,實際上因為沒有滿足特定的條件,他們還只是保存在緩沖區(qū)內,這時我們用_exit函數直接將程序關閉,緩沖區(qū)中的數據就會丟失,反之,如果向保證數據的完整性,就一定要使用exit函數。
exit()函數與_exit()函數最大的區(qū)別就在于exit()函數在調用exit系統(tǒng)調用之前要檢查文件的打開情況,把文件緩沖區(qū)中的內容寫回文件,就是圖中的"清理I/O緩沖"一項。
exit()函數定義在stdlib.h中,而_exit()定義在unistd.h中。exit()和_exit()都用于正常終止一個函數。但_exit()直接是一個sys_exit系統(tǒng)調用,而exit()則通常是普通函數庫中的一個函數。它會先執(zhí)行一些清除操作,例如調用執(zhí)行各終止處理函數、關閉所有標準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只輸出了一句話。原因就是因為最后一句話上沒有加上特殊的字符,如換行和文件結束符,因為這個時候文件是存放在緩沖區(qū)的,這個例子中文件就是存放打開的顯示設備的緩沖區(qū)中的,因為輸出函數要寫入,首先要進行系統(tǒng)調用,這個時候系統(tǒng)會打開顯示設備的緩沖區(qū),而exit的作用就是結束,清理,就是說先檢查緩沖區(qū),把沒有寫入的數據寫入到文件,而_exit是立刻關閉文件,文件緩沖區(qū)的內容也就消失了,這個時候就不可能再輸出到顯示設備了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Centos7的apache網站環(huán)境搭建wordpress
本篇文章給大家詳細分析了在Centos7的apache網站環(huán)境搭建wordpress的詳細操作方法,有興趣的朋友參考下。2018-02-02Linux使用Cron+AT實現在某個確定的時間段內隨機執(zhí)行命令
寫了個腳本簽到,但是不想總是在確定的時間簽到,不然在數據庫里面的記錄太假了,所以需要在確定的時間段內,隨機選個時間執(zhí)行,最后想到了使用Cron+AT實現,需要的朋友可以參考下2016-07-07Ubuntu20的tzselect設置時間失效的問題,樹莓派服務器(推薦)
這篇文章主要介紹了Ubuntu20的tzselect設置時間失效的問題,樹莓派服務器,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05PHP程序員玩轉Linux系列 搭建FTP代碼開發(fā)環(huán)境
這篇文章主要為大家詳細介紹了PHP程序員玩轉Linux系列文章,FTP代碼開發(fā)環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04