exit()與_exit()在linux進程控制中的區別

linux進程控制-exit()

#include<stdlib.h>
void exit(int status);

不像fork那麼難理解,從exit的名字就能看出,這個系統調用是用來終止一個進程的。無論在程序中的什麼位置,只要執行到exit系統調用,進程就會停止剩下的所有操作,清除包括PCB在內的各種數據結構,並終止本進程的運行。請看下面的程序:

/* exit_test1.c */
#include<stdlib.h>
main()
{
    printf("this process will exit!/n");
    exit(0);
    printf("never be displayed!/n");
}

編譯後運行:

$gcc exit_test1.c -o exit_test1
$./exit_test1
this process will exit!

我們可以看到,程序並沒有打印後面的"never be displayed!/n",因爲在此之前,在執行到exit(0)時,進程就已經終止了。
exit 系統調用帶有一個整數類型的參數status,我們可以利用這個參數傳遞進程結束時的狀態,比如說,該進程是正常結束的,還是出現某種意外而結束的,一般來說,0表示沒有意外的正常結束;其他的數值表示出現了錯誤,進程非正常結束。我們在實際編程時,可以用wait系統調用接收子進程的返回值,從而針對不同的情況進行不同的處理。關於wait的詳細情況,我們將在以後的篇幅中進行介紹。

exit_exit

作爲系統調用而言,_exitexit是一對孿生兄弟。
這時隨便一個懂得C語言並且頭腦清醒的人都會說,_exitexit沒有任何區別,但我們還要講一下這兩者之間的區別,這種區別主要體現在它們在函數庫中

的定義。_exitLinux函數庫中的原型是:

#include<unistd.h>
    void _exit(int status);

exit比較一下,exit()函數定義在 stdlib.h中,而_exit()定義在unistd.h中,從名字上看,stdlib.h似乎比unistd.h高級一點,那麼,它們之間到底有什麼區別呢?讓我們先來看流程圖,通過下圖,我們會對這兩個系統調用的執行過程產生一個較爲直觀的認識。
 

 

 

從圖中可以看出,_exit()函數的作用最爲簡單:直接使進程停止運行,清除其使用的內存空間,並銷燬其在內核中的各種數據結構;exit()函數則在這些基礎上作了一些包裝,在執行退出之前加了若干道工序,也是因爲這個原因,有些人認爲exit已經不能算是純粹的系統調用。
exit()函數與_exit()函數最大的區別就在於exit()函數在調用exit系統調用之前要檢查文件的打開情況,把文件緩衝區中的內容寫回文件,就是圖中的清理I/O緩衝一項。
Linux 的標準函數庫中,有一套稱作高級I/O”的函數,我們熟知的printf()fopen()fread()fwrite()都在此列,它們也被稱作緩衝I/Obuffered I/O其特徵是對應每一個打開的文件,在內存中都有一片緩衝區,每次讀文件時,會多讀出若干條記錄,這樣下次讀文件時就可以直接從內存的緩衝區中讀取,每次寫文件的時候,也僅僅是寫入內存中的緩衝區,等滿足了一定的條件(達到一定數量,或遇到特定字符,如換行符/n和文件結束符EOF),再將緩衝區中的內容一次性寫入文件,這樣就大大增加了文件讀寫的速度,但也爲我們編程帶來了一點點麻煩。如果有一些數據,我們認爲已經寫入了文件,實際上因爲沒有滿足特定的條件,它們還只是保存在緩衝區內,這時我們用_exit()函數直接將進程關閉,緩衝區中的數據就會丟失,反之,如果想保證數

據的完整性,就一定要使用exit()函數。

請看以下例程

/* exit2.c */
#include<stdlib.h>
main()
{
    printf("output begin/n");
    printf("content in buffer");
    exit(0);
}

編譯並運行:

$gcc exit2.c -o exit2
$./exit2
output begin
content in buffer

/* _exit1.c */
#include<unistd.h>
main()
{
    printf("output begin/n");
    printf("content in buffer");
    _exit(0);
}

編譯並運行:

$gcc _exit1.c -o _exit1
$./_exit1
output begin

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章