1. 程式人生 > >c程式啟動終止過程及exit(),_exit(),atexit()函式區別

c程式啟動終止過程及exit(),_exit(),atexit()函式區別

  1. c語言啟動與終止過程

  • main()函式不一定是程式的入口,在核心中可以使用連結器設定程式的開始地方。當核心使用一個exec函式執行c程式的時候,在main函式之前要先呼叫一個特殊的啟動例程,可執行程式將此例程指定為程式的起始地址。啟動例程從核心獲取命令列引數和環境變數,然後為呼叫main函式做好準備。

 

  2.exit(),_exit(),_Exit()函式的區別

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

  3.atexit()函式

  • atexit()函式是一個特殊的函式,他是在正常程式退出時呼叫的函式,稱之為登記函式(函式原型:int atexit()void (*)(void)))
  • 一個程序可以登記32個函式,這些函式由exit自動呼叫,這些函式稱為終止處理函式,atexit()函式可以登記這些函式。exit()呼叫終止處理函式的順序和atexit登記的順序相反(引數壓棧造成的,引數的壓棧是先進後出),如果一個函式被多次登記,也會被多次呼叫。
  • atexit()函式的呼叫順序和退出順序
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
4 void func1() 5 { 6 printf("The process is done...\n"); 7 } 8 void func2() 9 { 10 printf("Clean up the processing\n"); 11 } 12 void func3() 13 { 14 printf("Exit sucessful..\n"); 15 } 16 int main() 17 { 18 atexit(func1); 19 atexit(func2); 20 atexit(func3); 21 exit(0
); 22 23 }

 

  •  輸出結果是atexit()函式的呼叫順序與登記順序相反

4.atexit()函式的用途

  • atexit()函式可以按照你給予的順序摧毀全域性變數,比如有個log類,在其他的全域性類中也有可能呼叫到log類寫日誌。所以log類最後被析構。假定沒有定義析構順序,那麼程式在退出前有可能首先析構log類,那麼其他的全域性變數在此時將無法正確寫日誌。
  • 將資料寫回檔案,刪除臨時檔案等
  • 即註冊程式正常終止時要被呼叫的函式,並且函式的呼叫順序與註冊順序相反。