圖 C程式的啟動與終止
區別:
_exit()函數:直接使進程停止運行,清除其使用的記憶體空間,並銷毀其在核心中的各種資料結構;
exit()函 數則在這些基礎上作了一些封裝,在執行退出之前加了若干道工序。
exit()函數與_exit()函數最大的區別就在於 exit()函數在調用 exit 系統調用之前要檢查檔案的開啟情況,把檔案緩衝區中的內容寫迴文件。
#include<unistd.h>main(){printf("output begin\n");printf("content in buffer");//這裡不能加\n,一旦加了換行,則printf會立即輸出,行緩衝模式_exit(0);}//輸出:output begin
在Linux的標準函數庫中,有一套稱作“進階I/O”的函數,我們熟知printf() fopen() fread() fwrite()都在此列,它們也被稱作“緩衝I/O(buffered I/O)”,其特徵是對應每一個開啟的檔案,在記憶體中都有一片緩衝區,每次讀檔案時,會多讀出若干條記錄,這樣下次讀檔案時就可以直接從記憶體的緩衝區中讀取,每次寫檔案的時候,也僅僅是寫入記憶體中的緩衝區,等滿足了一定的條件(達到一定數量,或遇到特定字元,如分行符號\n和檔案結束 EOF),再將緩衝區中的內容一次性寫入檔案,這樣就大大增加了檔案讀寫的速度,但也為我們編程帶來了一點點麻煩。如果有一些資料,我們認為已經寫入了檔案,實際上因為沒有滿足特定的條件,它們還只是儲存在緩衝區內,這時我們用_exit()函數直接將進程關閉,緩衝區中的資料就會丟失,反之,如果想保證資料的完整性,就一定要使用exit()函數。
exit()在結束調用它的進程之前,要進行如下步驟:
1.cleanup();
2.在atexit()註冊的函數;
最後調用_exit()函數。。。
_exit()不執行I/O緩衝的重新整理動作
_exit終止調用進程,但不關閉檔案(應該也關閉檔案的),不清除輸出緩衝,也不調用出口函數。
exit函數將終止調用進程。在退出程式之前,所有檔案關閉,緩衝輸出內容
將重新整理定義,並調用所有已重新整理的“出口函數”(由atexit定義)。
_exit也會關閉檔案的。
_exit做3件事(man):
1,Any open file descriptors belonging to the process are closed
2,any children of the process are inherited by process 1, init
3,the process's parent is sent a SIGCHLD signal
exit執行完清理工作後就調用_exit來終止進程。