linux下exit()和_exit()區別

來源:互聯網
上載者:User

標籤:

    平時一直在用exit()函數,但是今天看源碼時竟然看到了_exit()函數,想知道它們的區別,所以就查查資料,寫了下來!

  #include<stdlib.h>  void exit(int status);
    不像fork那麼難理解,從exit的名字就能看出,這個系統調用是用來終止一個進程的。無論在程式中的什麼位置,只要執行到exit系統調用,進程就會停止剩下的所有操作,清除包括PCB在內的各種資料結構,並終止本進程的運行。請看下面的程式:
#include<stdlib.h>#include <stdio.h>main() {   printf("this process will exit!\n");   exit(0);//程式在次退出,不會再向下執行。   printf("never be displayed!\n");}

運行結果:


      我們可以看到,程式並沒有列印後面的"never be displayed!\n",因為在執行到exit(0)時,進程就已經終止了,不會再向下執行,直接退出。exit 系統調用帶有一個整數類型的參數status,我們可以利用這個參數傳遞進程結束時的狀態:
    (1) 0表示沒有意外的正常結束;
    (2)其他的數值表示出現了錯誤,進程非正常結束。

      我們在實際編程時,可以用wait系統調用接收子進程的返回值,從而針對不同的情況進行不同的處理。

      linux下exit()和_exit()的用法及區別:

       exit和_exit作為系統調用而言,_exit和exit是一對孿生兄弟。通常我們會認為,他們之間沒有什麼區別:但是沒有區別會有兩個函數,你要知道程式猿雖然苦但不笨,這種事兒發生的機率比較低,所以答案是否定的。這種區別主要體現在它們在函數庫中的定義,_exit在Linux函數庫中的原型是:
  #include<unistd.h>  void _exit(int status);
      (1)exit()函數定義在 stdlib.h中;而_exit()定義在unistd.h中,
      (2)_exit()函數的作用最為簡單:直接使進程停止運行,清除其使用的記憶體空間,並銷毀其在核心中的各種資料結構;exit()函數則在這些基礎上作了一些封裝,在執行退出之前加了若干道工序,也是因為這個原因,有些人認為exit已經不能算是純粹的系統調用。
      因此,exit()函數與_exit()函數最大的區別就在於:exit()函數在調用exit系統調用之前要檢查檔案的開啟情況,把檔案緩衝區中的內容寫迴文件,就是“清理I/O緩衝”,而_exit()則是直接退出,不管緩衝區的資料,直接停止,容易造成資料的丟失。 
      在Linux 的標準函數庫中,有一套稱作“進階I/O”的函數,我們熟知的printf()、fopen()、fread()、fwrite()都在此列,它們也被稱作“緩衝I/O(buffered I/O)”,其特徵是對應每一個開啟的檔案,在記憶體中都有一片緩衝區,每次讀檔案時,會多讀出若干條記錄,這樣下次讀檔案時就可以直接從記憶體的緩衝區中讀取,每次寫檔案的時候,也僅僅是寫入記憶體中的緩衝區,等滿足了一定的條件(達到一定數量,或遇到特定字元,如分行符號\n和檔案結束符EOF),再將緩衝區中的內容一次性寫入檔案,這樣就大大增加了檔案讀寫的速度,但也為我們編程帶來了一點點麻煩。如果有一些資料,我們認為已經寫入了檔案,實際上因為沒有滿足特定的條件,它們還只是儲存在緩衝區內,這時我們用_exit()函數直接將進程關閉,緩衝區中的資料就會丟失,反之,如果想保證資料的完整性,就一定要使用exit()函數。
    請看以下常式:
#include<stdlib.h>int main(){   printf("output begin\n");   printf("content in buffer\n");   exit(0);//輸出前兩句,程式在次退出;}
運行結果:

 從運行結果來看,exit(0)是函數正常的退出;
#include<unistd.h>int main() {    printf("output begin\n");    printf("content in buffer");    _exit(0);//直接清空緩衝空間,可能造成資料損失,不善後處理;}
運行結果:

       此時可以看出,_exit(0)函數直接退出清空資料,硬退出,而沒有管緩衝區的資料,也沒有寫會檔案或者對緩衝區的資料做善後處理,只輸出了一句,第二句的資料丟失了,相反exit(0)則會對緩衝區的資料進行處理後終止,例如寫會檔案,列印等等一些後續。

linux下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.