Linux中的atexit函式

2021-07-27 05:06:19 字數 1482 閱讀 5202

起初學習c語言的時候,我們都知道整個程式的入口是main函式,但是其實事實並不是如此,在核心中可以使用鏈結器來設定程式的開始地方。當核心使用乙個exec函式執行c程式時,在呼叫main函式之前先呼叫乙個特殊的啟動例程,可執行程式將此例程指定為程式的其實位址。啟動歷程從核心獲取命令列引數和環境變數,然後為main函式做好準備。

函式名: atexit

標頭檔案:#include功 能: 註冊終止函式(即main執行結束後呼叫的函式)

用 法: void atexit(void (*func)(void));

注意:exit呼叫這些註冊函式的順序與它們 登記時候的順序相反。同乙個函式如若登記多次,則也會被呼叫多次。

乙個程序可以登記若干個(至少32個)個函式,這些函式由exit自動呼叫,這些函式被稱為終止處理函式, atexit函式可以登記這些函式。 exit呼叫終止處理函式的順序和atexit登記的順序相反(網上很多說造成順序相反的原因是引數壓棧造成的,引數的壓棧是先進後出,和函式的棧幀相同),如果乙個函式被多次登記,也會被多次呼叫。

程序終⽌的⽅式有8種,前5種為正常終⽌它們是:

1:從 main 返回

2:呼叫 exit

3:呼叫 _exit 或 _exit

4:最後乙個執行緒從其啟動例程返回

5:最後乙個執行緒呼叫pthread_exit

異常終止有3種,它們是:

6:呼叫 abort

7:接到乙個訊號並終止

8:最後乙個執行緒對取消請求做出響應

exit()和_exit()以及_exit()函式的本質區別是是否立即進入核心,_exit()以及_exit()函式都是在呼叫後立即進入核心,而不會執行一些清理處理,但是exit()則會執行一些清理處理,這也是為什麼會存在atexit()函式的原因,因為exit()函式需要執行清理處理,需要執行一系列的操作,這些終止處理函式實際上就是完成各種所謂的清除操作的實際執行體。

驗證atexit函式的呼叫順和退出順序

eg:

#include

.h>

#include

.h>

void fun1()

void fun2()

void fun3()

void fun4()

int main()

執行結果:

大家會發現atexit函式的呼叫順序和登記順序是相反的。

atexit函式的用途也是比較廣泛的:可以按照你予設的順序摧毀全域性變數(類),例如有個log類,你在其它的全域性類裡也有可能呼叫到log類寫日誌。所以log 類必須最後被析構 。假如沒有規定析構順序,那麼程式在退出時將有可能首先析構log類,那麼其它的全域性類在此時將無法正確寫日誌。 把資料寫回檔案, 刪除臨時檔案, 這才是真正有用的。

atexit函式的作用

很多時候我們需要在程式退出的時候做一些諸如釋放資源的操作,但程式退出的方式有很多種,比如main 函式執行結束 在程式的某個地方用exit 結束程式 使用者通過ctrl c或ctrl break操作來終止程式等等,因此需要有一種與程式退出方式無關的方法來進行程式退出時的必要處理。方法就是用atexi...

atexit函式的用法

首先我們了解下atexit函式 函式名 atexit 標頭檔案 include 功 能 註冊終止函式 即main執行結束後呼叫的函式 原型 void atexit void func void 說明 atexit 用來設定乙個程式正常結束前呼叫的函式.當程式通過呼叫exit 或從main 中返回時,...

atexit函式詳解

對c語言有所了解的人都知道main函式是整個程式的入口,但是其實不然,在核心中可以使用鏈結器來設定程式的開始地方。當核心使 個exec函式執 c程式時,在調 main函式之前先調 個特殊的啟動例程,可執 程式將此例程指定為程式的起始位址。啟動例程從核心獲取命令 引數和環境變數,然後為調 main函式...