Linux下exit命令和
Linux下exit命令和
在Linux系統(tǒng)的命令中,exit命令和_exit命令看似相同實(shí)則有著不同的作用,那么exit命令和_exit命令具體有哪些區(qū)別呢?一起來和學(xué)習(xí)啦小編了解下吧。
注:exit()就是退出,傳入的參數(shù)是程序退出時(shí)的狀態(tài)碼,0表示正常退出,其他表示非正常退出,一般都用-1或者1,標(biāo)準(zhǔn)C里有EXIT_SUCCESS和EXIT_FAILURE兩個(gè)宏,用exit(EXIT_SUCCESS);可讀性比較好一點(diǎn)。
作為系統(tǒng)調(diào)用而言,_exit和exit是一對(duì)孿生兄弟,它們究竟相似到什么程度,我們可以從Linux的源碼中找到答案:
#define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */
“__NR_”是在Linux的源碼中為每個(gè)系統(tǒng)調(diào)用加上的前綴,請(qǐng)注意第一個(gè)exit前有2條下劃線,第二個(gè)exit前只有1條下劃線。 這時(shí)隨便一個(gè)懂得C語(yǔ)言并且頭腦清醒的人都會(huì)說,_exit和exit沒有任何區(qū)別,但我們還要講一下這兩者之間的區(qū)別,這種區(qū)別主要體現(xiàn)在它們?cè)诤瘮?shù)庫(kù)中的定義。_exit在Linux函數(shù)庫(kù)中的原型是:
#i nclude《unistd.h》 void _exit(int status);
和exit比較一下,exit()函數(shù)定義在stdlib.h中,而_exit()定義在unistd.h中,從名字上看,stdlib.h似乎比 unistd.h高級(jí)一點(diǎn),那么,它們之間到底有什么區(qū)別呢? _exit()函數(shù)的作用最為簡(jiǎn)單:直接使進(jìn)程停止運(yùn)行,清除其使用的內(nèi)存空間,并銷毀其在內(nèi)核中的各種數(shù)據(jù)結(jié)構(gòu);exit() 函數(shù)則在這些基礎(chǔ)上作了一些包裝,在執(zhí)行退出之前加了若干道工序,也是因?yàn)檫@個(gè)原因,有些人認(rèn)為exit已經(jīng)不能算是純粹的系統(tǒng)調(diào)用。 exit()函數(shù)與_exit()函數(shù)最大的區(qū)別就在于exit()函數(shù)在調(diào)用exit系統(tǒng)調(diào)用之前要檢查文件的打開情況,把文件緩沖區(qū)中的內(nèi)容寫回文件,就是“清理I/O緩沖”。
exit()在結(jié)束調(diào)用它的進(jìn)程之前,要進(jìn)行如下步驟:
1.調(diào)用atexit()注冊(cè)的函數(shù)(出口函數(shù));按ATEXIT注冊(cè)時(shí)相反的順序調(diào)用所有由它注冊(cè)的函數(shù),這使得我們可以指定在程序終止時(shí)執(zhí)行自己的清理動(dòng)作。例如,保存程序狀態(tài)信息于某個(gè)文件,解開對(duì)共享數(shù)據(jù)庫(kù)上的鎖等。
2.cleanup();關(guān)閉所有打開的流,這將導(dǎo)致寫所有被緩沖的輸出,刪除用TMPFILE函數(shù)建立的所有臨時(shí)文件。
3.最后調(diào)用_exit()函數(shù)終止進(jìn)程。
_exit做3件事(man): 1,Any open file descriptors belonging to the process are closed 2,any children of the process are inherited by process 1, init 3,the process‘s parent is sent a SIGCHLD signal
exit執(zhí)行完清理工作后就調(diào)用_exit來終止進(jìn)程。
此外,另外一種解釋:
簡(jiǎn)單的說,exit函數(shù)將終止調(diào)用進(jìn)程。在退出程序之前,所有文件關(guān)閉,緩沖輸出內(nèi)容將刷新定義,并調(diào)用所有已刷新的“出口函數(shù)”(由atexit定義)。
_exit:該函數(shù)是由Posix定義的,不會(huì)運(yùn)行exit handler和signal handler,在UNIX系統(tǒng)中不會(huì)flush標(biāo)準(zhǔn)I/O流。
簡(jiǎn)單的說,_exit終止調(diào)用進(jìn)程,但不關(guān)閉文件,不清除輸出緩存,也不調(diào)用出口函數(shù)。
共同:
不管進(jìn)程是如何終止的,內(nèi)核都會(huì)關(guān)閉進(jìn)程打開的所有file descriptors,釋放進(jìn)程使用的memory!