linux下exit 與 exit 的區別

2022-05-31 22:39:08 字數 1558 閱讀 2304

void exit(int staus) 函式, 在標頭檔案 #include

void _exit(int status) 函式,在標頭檔案 #include 中

在linux & c中描述兩者區別是:_exit返回後直接返回核心,而exit要進行清除工作,那麼兩者到底有什麼不同呢。編寫個小程式就很容易看出來:

int main(void)

對於這個程式對exit()和_exit兩次呼叫結果是不想同的:

exit():

hello linux c!i love u~

_exit()則什麼也沒有輸出,如果給第乙個printf加上'\n'的話,那就只會輸出第一句話。

那麼我們簡單談一談exit比_exit多做了些什麼,其實exit結束程序也是呼叫了_exit函式,但是它在之前做了兩點:

1.呼叫atexit()註冊的函式(出口函式);按atexit註冊時相反的順序呼叫所有由它註冊的函式,這使得我們可以指定在程式終止時執行自己的清理動作.例如,儲存程式狀態資訊於某個檔案,解開對共享資料庫上的鎖等.

2.cleanup();

關閉所有開啟的流,這將導致寫所有被緩衝的輸出

,刪除用tmpfile函式建立的所有臨時檔案。

這個的意思就是第一步將程式的資訊儲存,解開設的鎖,第二步清空快取,這個清空快取就是寫入檔案。我們知道對於printf,為了輸出的效率提高,計算機會將輸入的資訊存入快取。最後寫入標準輸出檔案輸出。所以這就能解釋為什麼_exit什麼都沒有輸出,因為它沒有將快取寫入檔案就已經退出。至於為什麼加入'\n'後可以輸出一句話這同樣與快取寫入檔案有關,printf

函式在遇到「\

n」換行符時自動的從緩衝區中將記錄讀出。

從這一點我們也可以看出一些問題,那就是如果fork乙個子程序在退出該子程序的時候呼叫的是exit函式的話,那麼它會重新整理快取,雖然是子程序執行的但是因為子程序與父程序共享位址,所以會出現的問題是標準輸出檔案被關掉,printf什麼也沒輸出。但是這個問題對於linux是不會出現的,因為其exit時只是減少了乙個對輸出的檔案的引用計數,並沒有影響父程序。

綜上所述,exit函式將終止呼叫程序。在退出程式之前,所有檔案關閉,緩衝輸出內容將重新整理定義,_exit終止呼叫程序,但不關閉檔案,不清除輸出快取。

linux下exit 和 exit 的區別

include void exit int status 不像fork那麼難理解,從exit的名字就能看出,這個系統呼叫是用來終止乙個程序的。無論在程式中的什麼位置,只要執行到exit系統呼叫,程序就會停止剩下的所有操作,清除包括pcb在內的各種資料結構,並終止本程序的執行。請看下面的程式 exit...

exit 與 exit 的辨析

1 標頭檔案區別 include exit int status include exit int status 2 作用的不同 exit 退出程序前作乙個i o緩衝區處理。exit 直接退出程序。3 具體程式 exit include include int main explore ubuntu...

exit 與 exit 的區別

從圖中可以看出,exit 函式的作用是 直接使程序停止執行,清除其使用的記憶體空間,並清除其在核心的各種資料結構 exit 函式則在這些基礎上做了一些小動作,在執行退出之前還加了若干道工序。exit 函式與 exit 函式的最大區別在於exit 函式在呼叫exit 系統呼叫前要檢查檔案的開啟情況,把...