C語言中的程式終止函式

2022-09-17 10:54:14 字數 2719 閱讀 8952

在c語言的標準庫中提供了一些與正常或者不正常的程式終止有關的函式,下面分別對其進行簡單介紹。

[1] c和指標,p298,342

[2] c程式語言現代方法(第2版),p489

[3] atexit函式和exit函式的理解

1 abort()

abort()函式用於不正常地終止乙個正在執行的程式。函式原型如下:

void abort(void)

這個函式將引發sigabrt訊號,你可以在程式中為這個訊號設定乙個訊號處理函式,在程式終止(或乾脆不終止)之前採取任何你想採取的動作,甚至可以不終止程式。

abort()函式類似於exit()函式,但呼叫它會導致異常的程式終止。atexit()函式註冊的退出函式不會被呼叫。根據具體的實現,它可能不會清理包含未輸出資料的輸出緩衝區,不會關閉開啟的流,也不會刪除臨時檔案。abort()函式返回乙個由實現定義的狀態碼來指出「不成功的終止」。

補充:

呼叫abort()函式時,實際上會產生sigabrt訊號。如果沒有處理sigabrt訊號的函式,那麼程式會如前所述那樣異常終止。如果(通過呼叫signal()函式)為sigabrt安裝了訊號處理函式,那麼就會呼叫處理函式。如果處理函式返回,隨後程式會異常終止。但是,如果處理函式不返回(比如它呼叫了longjmp()函式),那麼程式就不會終止。

2 atexit()

atexit()函式可以把一些函式註冊為退出函式(exit function)。函式原型如下:

int atexit(void (*func) (void))

把函式指標傳遞給atexit()函式時,它會把指標儲存起來留給將來引用。當程式將要正常終止時(或者由於呼叫exit,或者由於main函式返回),退出函式將被呼叫。退出函式不能接受任何引數

3 exit()

exit()函式用於正常終止程式。函式原型如下:

void exit(int)

如果程式以main函式返回乙個值結束,那麼其效果相當於用這個值作為引數呼叫exit()函式。在程式中的任何位置執行exit(n)呼叫通常等價於在main函式中執行return n。

int引數返回給作業系統,用於提示程式是否正常完成。預定義符號exit_successexit_failure分別提示程式的終止成功還是失敗。exit()函式僅有的另乙個可移植引數是0,它和巨集exit_success的意義相同。雖然程式也可以使用其他值,但它們的具體含義將取決於編譯器。

當程式發現錯誤情況使它無法繼續執行下去時,這個函式尤其有用。你經常會在呼叫perrno之後再呼叫exit()終止程式。儘管終止程式並非處理所有錯誤的正確方法,但和乙個注定失敗的程式繼續執行以後再失敗相比,這種做法更好一些。

注意,這個函式沒有返回值。當exit()函式結束時,程式已經消失,所以它無處返回。

當exit()函式被呼叫時,所有被atexit()函式註冊為退出函式的函式將按照它們所註冊的順序被反序依次呼叫(引數由於被壓入棧中,而先進後出)。然後,所有用於流的緩衝區被重新整理,所有開啟的檔案被關閉。用tmpfile()函式建立的檔案被刪除。然後,退出狀態返回給宿主環境,程式停止執行。

警告:

由於程式停止執行,所以exit()函式絕對不會返回到它的呼叫處。但是,如果任何乙個用atexit()註冊為退出函式的函式如果再次呼叫了exit(),其效果是未定義的。這個錯誤可能導致乙個無限迴圈,很可能只有當堆疊的記憶體耗盡才會終止。

4 _exit()

_exit()函式類似於exit()函式,但是_exit()不會呼叫atexit()註冊的退出函式,也不會呼叫之前傳遞給signal()函式的訊號處理函式。此外,_exit()函式不需要清洗輸出緩衝區,關閉開啟的流,以及刪除臨時檔案,是否執行這些操作是由實現定義的。函式原型如下:

void _exit(int)

按照iso c規定,乙個程序可以登記多達32個函式,通常這32個函式被稱為終止處理程式(退出函式),通過呼叫atexit()函式來登記這些函式,這些函式將由exit()函式自動呼叫。

exit()和_exit()以及_exit()函式的本質區別是是否立即進入核心,_exit()以及_exit()函式都是在呼叫後立即進入核心,而不會執行一些清理處理,但是exit()則會執行一些清理處理,這也是為什麼會存在atexit()函式的原因,因為exit()函式需要執行清理處理,需要執行一系列的操作,這些終止處理函式實際上就是完成各種所謂的清除操作的實際執行體。atexit函式的定義也給了程式設計師一種運用exit執行一些清除操作的方法,比如有一些程式需要額外的操作,具體的清除操作可以採用這種方法對特殊操作進行清除等。

核心使程式執行的唯一方法是呼叫乙個exec()函式,程序自願終止的唯一方法是顯式或者隱式呼叫(通過exit函式)_exit()或者_exit()函式。因此exit函式中實質是對_exit()或者_exit()函式的封裝。exit會先執行自定義的終止處理函式,然後執行i/o庫函式清理函式fclose(),這也是為什麼可以在終止處理函式中可以繼續運用printf之類函式的原因,因為i/o庫函式的流物件還沒有被清除,當然可以繼續運用。執行完了所有的fclose()以後,可以執行真正意義上的終止函式_exit()或者_exit()函式。

C語言中的函式

在對c語言有過一定的了解之後,我們都會涉及到乙個概念 函式。那麼,什麼是函式呢?首先,我們來看一段 includeint max int x,int y int main 在上面的程式中,我們將引數a,b傳入到函式max之中,最後求出結果並返回,那麼,這樣寫的好處是什麼呢?我們為什麼要使用函式來實現...

0 C 常用的程式終止函式

1.abort函式 函式原型 void abort void 功能 中斷程式的執行,返回c 系統的主視窗。該函式在stdlib標頭檔案宣告。2.assert函式 函式原型 void assert int expression 功能 計算表示式expression的值,若該值為false,則中斷程式的...

C語言中的函式指標

開啟去年6月的乙個test.cpp檔案,發現對裡面測試的函式指標幾乎沒有印象了。溫故而知新,於是重新找到ansi c 裡面的說明 除了宣告指向整型數字 雙精度型數字和c語言其他資料型別的指標外,指標也能夠被宣告指向乙個函式 包含乙個函式的位址 指向函式的指標是可能的,因為函式名像陣列名一樣,它們本身...