原文地址:http://blog.sina.com.cn/s/blog_4850a7880100hncm.html
參考:http://lzjyjh.blog.sohu.com/137646727.html
———————————————————————————————————————————————
在Unix OS中,通過執行系統調用exit來終止一個進程。進程可以顯示的調用exit系統調用來終止一個進程,也可以通過在程式結束時的return來實現(startup
routine調用exit當一個C程式從main函數返回時)。
調用exit方式如下:
exit(status);
status是返回給父進程的終止code。當一個進程exit後,這個進程處於zombie
state。
exit系統調用的執行發生以下事件:
1.清除當前進程的所有訊號處理函數。
2.如果當前進程是和終端關聯的“進程組組長”,則會向每個組內進程發送hang-up
signal,並且把這些成員的進程組設定為0。
3.通過核心內部演算法關閉當前進程所有開啟的檔案描述符,並且釋放目前的目錄所關聯的inode;如果存在current
(charged)root,也將其釋放通過演算法iput。
4.為進程釋放所有的region以及關聯的memory。
5.計算進程機器子進程執行的時間(user
mode 和kernel mode),並把記錄寫到一個全域的accounting file。
6.將進程的狀態改變為zombie,並將自己的所有的子進程的父進程ID設定為1(init);如果有孩子的狀態是zombie,向init進程發SIGCHLD訊號,以清除子進程的process
table slot。
7.exiting進程向自己的父進程發送SIGCHLD訊號。
8.進行context
switch,調度其他非zombie進程(本進程已經是zombie)。
在討論exit與_exit之前,先來討論檔案記憶體緩衝區的問題。
在linux中,標準輸入輸出(I/O)函數都是作為檔案來處理。對應於開啟的每個檔案,在記憶體中都有對應的緩衝,每次讀取檔案時,會多讀一些記錄到緩衝中,這樣在下次讀檔案時,就在緩衝中讀取;同樣,在寫檔案時也是寫在檔案對應的緩衝中,並不是直接寫入硬碟的檔案中,等滿足了一定條件(如達到一定數量,遇到分行符號\n或檔案結束標誌EOF)才將資料真正的寫入檔案。這樣做的好處就是加快了檔案讀寫的速度!但這樣也帶來了一些問題:比如有一些資料,我們認為已經寫入了檔案,但實際上沒有滿足一定條件而任然駐留在記憶體的緩衝中,這樣,如果我們直接用_exit()函數直接終止進程,將導致資料丟失!!
也許細心地讀者已經發現前面使用的是_exit而不是exit,如果改成exit,就不會有資料丟失的問題出現了,這就是我要說的它們之間的區別了!要解釋這個問題,就要涉及它們的工作步驟了。
exit():在執行該函數時,進程會檢查檔案開啟情況,清理I/O緩衝,如果緩衝中有資料,就會將它們寫入相應的檔案,這樣就防止了檔案資料的丟失!然後終止進程。
_exit():在執行該函數時,並不清理標準輸入輸出緩衝,而是直接清除記憶體空間,當然也就把檔案快取中尚未寫入檔案的資料給銷毀了。由此可見,使用exit()函數更加安全。
此外,對於它們兩者的區別還有各自的標頭檔不同:exit()--stdlib.h _exit()--unistd.h
最後提一下,一般情況下exit(0)表示正常退出,exit(1),exit(-1)為異常退出,0、1、-1是傳回值,具體含義可以自定.
exit好象在stdio.h裡面,所以要有包含標頭檔
return是返回函數調用,如果返回的是main函數,則為退出程式
exit是在調用處強行退出程式,運行一次程式就結束
-------------------------------------------------------------------
return
是返回
函數返回
而exit是退出
-------------------------------------------------------------------
exit(1)表示異常退出.這個1是返回給作業系統的不過在DOS好像不需要這個傳回值
exit(0)表示正常退出
-------------------------------------------------------------------
無論寫在那裡,都是程式推出,dos和windows中沒有什麼不一樣,最多是系統處理的不一樣。
數字0,1,-1會被寫入環境變數ERRORLEVEL,其它程式可以由此判斷程式結束狀態。
一般0為正常推出,其它數字為異常,其對應的錯誤可以自己指定。
-------------------------------------------------------------------
返回給作業系統的,0是正常退出,其他值是異常退出,在退出前可以給出一些提示資訊,或在偵錯工具中察看出錯原因.