NAME
exit - 正常終止一個程序
SYNOPSIS
#include <stdlib.h>
void exit(int status);
DESCRIPTION
exit()函數用於正常終止一個進程,參數status&0377作爲終止狀態,返回給父進程.
調用exit函數時,通過函數atexit或on_exit註冊的所有函數(終止處理程序)都會被調用,且調用的順序剛好與註冊時候的順序相反.(在這些終止處理程序中有可能是爲了在程序終止時執行一個額外的處理.新註冊的函數會被添加到註冊隊列的頭部,然後等待被調用.)如果這些終止處理程序沒有返回退出(比如:_exit函數或kill a signal),那麼剩餘的終止處理程序將不會被調用.exit函數也將被拋棄終止.如果同一個函數如若註冊多次,則也會被調用多次.
調用exit函數後,所有的IO流都會被關閉,由tmpfile創建的文件也會被移除.
在C標準中設定了兩個常量,EXIT_SUCCESS和EXIT_FAILURE,用來作爲exit函數的參數,分別指出進程是正常退出還是異常終止.
RETURN VALUE
exit函數沒有返回值.
ATTRIBUTES
多線程
函數exit使用了一個不受保護的全局變量,所以它不是安全的線程.
CONFORMING TO
SVr4, 4.3BSD, POSIX.1-2001, C89, C99.
NOTES
如果終止處理函數調用了exit或longjmp函數,那發生的後果將是無法預知的.注意,調用execve函數將移除所有終止處理程序.
相對於0和非0值,用EXIT_SUCCESS和EXIT_FAILURE更加簡易明.特別的,VMS採用了不同的規定.
BSD嘗試將exit函數規範化.
調用exit函數,退出進程後,終止狀態必須要傳遞給父進程.這時,會發生三種情況:如果父進程設置了SA_NOCLDWAIT標誌位(SA_NOCLDWAIT:使父進程在它的子進程退出時不會收到 SIGCHLD 信號,這時子進程如果退出也不會成爲殭屍進程.) 或者是將信號SIGCHLD交給SIG_IGN處理(當一個進程正常或異常終止時,內核就向父進程發送SIGCHLD信號,如果父進程不處理,交給SIG_IGN,則相當於父進程忽略子進程的生死.)子進程的終止狀態會被拋棄.如果父進程正在等待取得子進程結束的終止狀態.在這兩種情況下,子進程將會馬上終止,釋放資源.如果一個已經終止,但父進程尚未對其進行善後處理的進程,被稱之爲僵死進程(進程已經終止,但是還沒釋放所佔用的資源).所以父進程可以通過調用wait函數來等待處理退出的子進程.
如果系統支持信號機制,可以通過信號傳遞給父進程,但是如果父進程設置了SA_NOCLDWAIT標誌位,父進程將無法收到信號.
如果進程是回話首進程且控制着一個控制終端,該進程終止後,該回話組的所有進程都會收到一個SIGHUP信號,同時終端也將會被釋放,這些進程或終端可以加入到別的進程組.
如果退出進程使得該組其他進程成爲孤兒進程,這些孤兒進程將會終止,同時會接收到由信號處理程序SIGCONT發來的SIGHUP信號.
END
筆者:個人能力有限,只是學習參考...讀者若發現文中錯誤,敬請提出.