系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux下exit命令

Linux下exit命令和_exit命令區(qū)別盤點(diǎn)

時(shí)間:2014-12-09 10:04:48 作者:qipeng 來(lái)源:系統(tǒng)之家 1. 掃描二維碼隨時(shí)看資訊 2. 請(qǐng)使用手機(jī)瀏覽器訪問(wèn): https://m.xitongzhijia.net/xtjc/20141208/32064.html 手機(jī)查看 評(píng)論

  在Linux系統(tǒng)的命令中,exit命令和_exit命令看似相同實(shí)則有著不同的作用,那么exit命令和_exit命令具體有哪些區(qū)別呢?一起來(lái)了解下吧。

 Linux下exit命令和_exit命令區(qū)別盤點(diǎn)

  注: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ì)說(shuō),_exit和exit沒(méi)有任何區(qū)別,但我們還要講一下這兩者之間的區(qū)別,這種區(qū)別主要體現(xiàn)在它們?cè)诤瘮?shù)庫(kù)中的定義。_exit在Linux函數(shù)庫(kù)中的原型是:

 。 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)用之前要檢查文件的打開(kāi)情況,把文件緩沖區(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è)文件,解開(kāi)對(duì)共享數(shù)據(jù)庫(kù)上的鎖等。

  2.cleanup();關(guān)閉所有打開(kāi)的流,這將導(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來(lái)終止進(jìn)程。

  此外,另外一種解釋:

  簡(jiǎn)單的說(shuō),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)單的說(shuō),_exit終止調(diào)用進(jìn)程,但不關(guān)閉文件,不清除輸出緩存,也不調(diào)用出口函數(shù)。

  共同:

  不管進(jìn)程是如何終止的,內(nèi)核都會(huì)關(guān)閉進(jìn)程打開(kāi)的所有file descriptors,釋放進(jìn)程使用的memory!

標(biāo)簽 命令 exit

發(fā)表評(píng)論

0

沒(méi)有更多評(píng)論了

評(píng)論就這些咯,讓大家也知道你的獨(dú)特見(jiàn)解

立即評(píng)論

以上留言僅代表用戶個(gè)人觀點(diǎn),不代表系統(tǒng)之家立場(chǎng)

其他版本軟件

熱門教程

人氣教程排行

Linux系統(tǒng)推薦

官方交流群 軟件收錄