NAME
atexit - 用來註冊執行exit()函數前執行的終止處理程序.
SYNOPSIS
#include <stdlib.h>
int atexit(void (*function)(void));
DESCRIPTION
atexit()用來註冊終止處理程序,當程序通過調用exit()或從main 中返回時被調用.終止處理程序執行的順序和註冊時的順序是相反的,終止處理程序沒有參數傳遞.同一個函數若註冊多次,那它也會被調用多次.按POSIX.1-2001規定,至少可以註冊32個終止處理程序,若想查看實際可以註冊多少個終止處理程序,可以通過調用sysconf()函數獲得.
當一個子進程是通過調用fork()函數產生時,它將繼承父進程的所有終止處理程序.在成功調用exec系列函數後,所有的終止處理程序都會被刪除.
RETURN VALUE
成功返回0,失敗返回非0值.
CONFORMING TO
SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
NOTES
如果一個進程被信號所中斷,那由atexit()函數註冊的終止處理程序不會被調用.
如果在其中一個終止處理程序中調用了_exit()函數;那剩餘的終止處理程序將不會得到調用,同時由exit()函數調用的其他終止進程步驟也將不會執行.
在POSIX.1-2001標準中,在終止進程過程中,在終止處理程序中,不只一次的調用exit()函數,這樣導致的結果是未定義的.在某些系統中,這樣的調用將會導致遞歸死循環.可移植的程序不應該在終止處理程序中調用exit()函數.
函數atexit()和on_exit()在註冊終止程序時,有一樣的列表.在進程正常退出時執行終止處理程序,調用的順序剛好與註冊時相反.
按POSIX.1-2001的規定,如果在終止處理程序中調用longjmp()函數,這樣導致的結果是未定義的.
Linux notes
自glibc2.2.3版本後,atexit()和on_exit()函數能夠使用在共享庫建立的函數,當共享庫卸載時被調用.
EXAMPLE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
bye(void)
{
printf("That was all, folks\n");
}
int
main(void)
{
long a;
int i;
a = sysconf(_SC_ATEXIT_MAX);
printf("ATEXIT_MAX = %ld\n", a);
i = atexit(bye);
if (i != 0) {
fprintf(stderr, "cannot set exit function\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
END
筆者:個人能力有限,只是學習參考...讀者若發現文中錯誤,敬請提出.