atexit()函數使用說明

摘要:本文描述的是Linux手冊頁中atexit()函數的使用說明,使用atexit()函數註冊終止處理程序.原文來自:http://www.kernel.org/doc/man-pages/.
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

筆者:個人能力有限,只是學習參考...讀者若發現文中錯誤,敬請提出.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙築高臺,靜下心來,慢慢地沉澱---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章