1. 程式人生 > >atexit函式的呼叫與exit函式和_exit函式的區別

atexit函式的呼叫與exit函式和_exit函式的區別

1 atexit()函式
標頭檔案:#include<stdlib.h>
功 能: 註冊終止函式(即main執行結束後呼叫的函式)
用 法: int atexit(void (*func)(void));

注意:按照ISO C的規定,一個程序可以登記多達32個函式,這些函式將由exit自動呼叫。atexit()註冊的函式型別應為不接受任何引數的void函式,exit呼叫這些註冊函式的順序與它們 登記時候的順序相反。同一個函式如若登記多次,則也會被呼叫多次。

假設我們使用atexit註冊5個函式,他們的呼叫順序並不是按照我們設想的按順序從第一個函式開始呼叫到第五個函式。

程式碼:


執行結果為:


可以看出,atexit的呼叫順序是與他們註冊的順序相反。

2 exit()函式和_exit()的區別

exit()函式與_exit()函式最大的區別就在於exit()函式在呼叫exit系統呼叫之前要檢查檔案的開啟情況,把檔案緩衝區中的內容寫回檔案,就是圖中的"清理I/O緩衝"一項。

exit()函式定義在stdlib.h中,而_exit()定義在unistd.h中。exit()和_exit()都用於正常終止一個函式。但_exit()直接是一個sys_exit系統呼叫,而exit()則通常是普通函式庫中的一個函式。它會先執行一些清除操作,例如呼叫執行各終止處理函式、關閉所有標準IO等,然後呼叫sys_exit。
 比如:

int main()
{ printf("this is a test function!!!/n")
 printf("test exit ");
 exit(0);
}
int main()
{ printf("this is a test function!!!/n")
 printf("test exit");
 _exit(0);
}

這兩個程式,程式1輸出的是兩句話,而程式2只輸出了一句話。原因就是因為最後一句話上沒有加上特殊的字元,如換行和檔案結束符,因為這個時候檔案是存放在緩衝區的,這個例子中檔案就是存放開啟的顯示裝置的緩衝區中的,因為輸出函式要寫入,首先要進行系統呼叫,這個時候系統會開啟顯示裝置的緩衝區,而exit的作用就是結束,清理,就是說先檢查緩衝區,把沒有寫入的資料寫入到檔案,而_exit是立刻關閉檔案,檔案緩衝區的內容也就消失了,這個時候就不可能再輸出到顯示裝置了。