C/C++中的abort、atexit、exit和_Exit

     這幾個函數都在頭文件#include <stdlib.h>中聲明。exit_Exitabort函數使程序終止,控制並不返回到這些函數的調用者。

exit()函數

void exit(intstate);

exit()函數用於在程序運行的過程中隨時結束程序,exit的參數state是返回給操作系統,返回0表示程序正常結束,非0表示程序非正常結束。main函數結束時也會隱式地調用exit函數。exit函數運行時首先會執行由atexit()函數登記的函數,然後會做一些自身的清理工作,同時刷新所有輸出流、關閉所有打開的流、刪除過標準I/O函數tmpfile()創建的臨時文件、控制返回宿主環境,提供狀態值。

按照許多系統中的習慣,state值爲0表示終止程序成功,用非0值表示異常終止。標準C語言中數值0和宏EXIT_SCCESS的值表示終止成功,宏EXIT_FAILURE的值表示終止不成功,其他值的含義由實現定義。從函數main返回一個整數值相當於用這個值調用exit函數。

_Exit()函數

void _Exit(int status);         //C99

函數_Exitexit函數不同之處在於既不調用atexit註冊的退出處理器,也不調用singal註冊的信號處理器。是否進行其他清理操作由實現定義,如關閉所有打開的數據流。_ExitC99增加的,傳統上有些實現用名爲_exit的函數提供類似功能。

atexit()函數

intatexit(void*func)(void));

很多時候我們需要在程序退出的時候做一些諸如釋放資源的操作,但程序退出的方式有很多種,比如main()函數運行結束、在程序的某個地方用exit()結束程序、用戶通過Ctrl+CCtrl+break操作來終止程序等等,因此需要有一種與程序退出方式無關的方法來進行程序退出時的必要處理。方法就是用atexit()函數來註冊程序正常終止時要被調用的函數。

atexit()函數的參數是一個函數指針,函數指針指向一個沒有參數也沒有返回值的函數。atexit()的函數原型是:int atexit (void (*)(void));

在一個程序中最多可以用atexit()註冊32個處理函數,這些處理函數的調用順序與其註冊的順序相反,也即最先註冊的最後調用,最後註冊的最先調用。註冊函數不能引用任何不是自己定義的存儲類爲auto register的對象(例如通過指針引用)。函數註冊幾次就會在此時調用幾次。

下面是一段代碼示例:

 

#include <stdlib.h>

#include<iostream.h>

void terminateTest()

{

    cout<<"程序正在結束..."<<endl;

}

int main(void)

{

    // 註冊退出處理函數

    atexit(terminateTest);

    cout<<"the end ofmain()"<<endl;

    return 0;

}

程序的運行結果爲:

the end of main()

程序正在結束...

這些函數都是main結束以後才被調用的。atexit只是註冊他們,使得他們在main結束以後被調用,看名字就可以看出來。atexit這個玩意超有用,可以按照你預設的順序摧毀全局變量(類),例如有個log類,你在其它的全局類裏也有可能調用到Log類寫日誌。所以log類必須最後被析構。假如沒有規定析構順序,那麼程序在退出時將有可能首先析構log類,那麼其它的全局類在此時將無法正確寫日誌


abort()函數


void abort(void);


abort函數使程序異常終止,不調用向atexit註冊的函數。abort是否引起清理操作由實現定義,向宿主系統返回的狀態值也由實現定義,但應表示爲“不成功”。在標準C語言和許多傳統實現中,調用abort轉換成可以捕獲的特殊信號(標準C語言中爲SIGABRT)。如果信號被忽略或處理器返回,則標準C語言實現仍然終止程序,而其他實現可能使abort函數返回調用者。斷言失敗也會調用abort



發佈了31 篇原創文章 · 獲贊 23 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章