exit() _exit()

來源:互聯網
上載者:User

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來終止進程。

  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.