程序有5種正常終止以及三種異常終止方式。
1:從 main 函式返回:
執行return從main函式返回等同於呼叫exit函式。
2:呼叫 exit 函式:
呼叫exit函式,這個函式由iso c所定義,包括呼叫呼叫所有的被atexit註冊過的退出處理程式和關閉所有的標準i/o流。因為iso c不會處理檔案描述符、多程序、作業控制,所以在unix系統中,這個函式的定義有些不完整。
3:呼叫 _exit 函式或者是 _exit 函式:
iso c定義了乙個_exit函式來提供程序結束時,其目的是為程序提供一種無需執行終止處理程式或訊號處理程式而終止的方法。在unix系統中,_exit和_exit同義,都不用重新整理標準i/o流 。 _exit函式由posix.1所定義。
在大多數 unix系統中exit函式是標準的c庫函式,_exit是系統呼叫。
4:從最後乙個執行緒中返回:
執行緒的返回值不作為程序的返回值,當最後乙個執行緒從例程返回時,程序結束時的結束狀態值為0。
5:從最後乙個執行緒中呼叫 pthread_exit:
和4中的一樣,這種情況下同樣返回0,與傳遞到pthread_exit函式中的引數無關。
6:呼叫 abort;
7:接收到訊號;
8:應答最後乙個執行緒的取消請求;
不管乙個程序如何結束,核心都會為這個結束的程序關閉所有的開啟的件描述符,釋放所利用的記憶體,等等。
如果我們想要結束的程序通知父程序自己是如何結束的,對於exit 、 _exit和_exit ,通過傳遞退出狀態值,作為函式的引數來實現。
對於非正常的結束方式,由核心,而不是結束程序,生成乙個結束狀態值來指示非正常結束的原因。這時,父程序可以通過 wait和waitpid函式 來獲取結束程序的結束狀態值。
核心為每個終止子程序儲存了一定量的資訊,所以當終止程序的父程序呼叫wait或waitpid時,可以得到有關資訊。這種資訊至少包括程序id、該程序的終止狀態、以反該程序使用的cpu時間總量。核心可以釋放終止程序所使用的所有儲存器,關閉其所有開啟檔案。
#include
void exit(int status)
;void _exit(int status)
;#include
void _exit(int status)
;
3個函式都用於正常終止乙個程式
_exit和_exit立即進入核心。exit則先執行一些清理處理(例如關閉所有由核心開啟的描述符),再返回核心。
當呼叫乙個fork函式後,子程序就會有乙個父程序。當父程序先於子程序結束時,init程序會成為這個子程序的父程序。
具體的實現如下,通常情況下,在乙個程序結束時,核心會遍歷所以的活動程序,看是否有結束程序的子程序。如果有這個程序parent pid值,修改為1(init程序的pid),這樣保證了所以的程序都有父程序。
在子程序先於父程序結束的情況下,當父程序要檢查乙個子程序是否結束時,子程序完全消失了,這時父程序不能取得結束子程序的結束狀態資訊。
在乙個程序結束時,核心會儲存儲存每個結束程序的少量資訊。這些資訊最少包含,程序id,結束狀態值,程序利用的cpu時間。當父程序呼叫wait或者是waitpid時,可以利用這些結束資訊。
在unix系統術語中,乙個已經終止、但父程序尚未對其進行善後處理(獲取子程序的有關資訊、釋放它仍占有的資源)的程序稱為僵死程序。
ps命令中將僵死程序的狀態列印為z。
如果我們寫乙個長時間執行的程式,在這個程式中fork了很多子程序,那麼除非父程序等待取得子程序的終止狀態,不然這些子程序終止後就會變為僵死程序。
如果乙個程序繼承了init,那麼他是否會成為僵死程序,答案是否定的。因為init的任何乙個子程序結束時,init會呼叫wait函式來取得結束狀態值。從而避免僵死程序的產生。
從上可以看出,在 子程序先於父程序 結束,而父程序沒有wait這個子程序才會產生僵死程序。
程序退出方式
程序退出分為正常退出和異常退出兩種 1 正常退出 a.在main函式中執行return b.呼叫exit函式 c.呼叫 exit函式 2 異常退出 a.呼叫about函式。b.程序受到某個訊號,而該訊號使程式終止。總結 不管是那種退出方式,最終都會執行核心中的同一段 這段 用來關閉程序中所有開啟的檔...
程序的退出方式
程序退出有8種方式 三種正常的退出方式 1.從main函式退出 2.呼叫exit 3.呼叫 exit exit 後五種為異常退出方式 4.最後乙個執行緒從啟動歷程返回 5.最後乙個執行緒呼叫pthread exit 6.呼叫abort 7.接到乙個訊號並終止 8.最後乙個執行緒對取消請求做出響應 先...
unix環境下程序意外退出終止
在編寫unix程式的時候,常常會出現一些錯誤,而最毀滅性的就是程序直接down掉 程序意外退出會給使用者帶來很多負面影響 同時如果除錯和日誌檔案不夠完善的話,查起錯來相當麻煩,再加上使用者環境和我們的開發環境不一樣,當你回過頭來改這個錯誤,如果日誌不夠完善,甚至需要在使用者的環境下復現錯誤,這基本上...