linux中进程退出函数:exit()和_exit()的区别
?
?
?
? ? ? ? ? ? ?linux中進(jìn)程退出函數(shù):exit()和_exit()的區(qū)別
(1)_exit()執(zhí)行后立即返回給內(nèi)核,而exit()要先執(zhí)行一些清除操作,然后將控制權(quán)交給內(nèi)核。
(2)調(diào)用_exit函數(shù)時(shí),其會(huì)關(guān)閉進(jìn)程所有的文件描述符,清理內(nèi)存以及其他一些內(nèi)核清理函數(shù),但不會(huì)刷新流(stdin, stdout, stderr ...). exit函數(shù)是在_exit函數(shù)之上的一個(gè)封裝,其會(huì)調(diào)用_exit,并在調(diào)用之前先刷新流。
(3)exit()函數(shù)與_exit()函數(shù)最大區(qū)別就在于exit()函數(shù)在調(diào)用exit系統(tǒng)之前要檢查文件的打開(kāi)情況,把文件緩沖區(qū)的內(nèi)容寫(xiě)回文件。由于Linux的標(biāo)準(zhǔn)函數(shù)庫(kù)中,有一種被稱(chēng)作“緩沖I/O”的操作,其特征就是對(duì)應(yīng)每一個(gè)打開(kāi)的文件,在內(nèi)存中都有一片緩沖區(qū)。每次讀文件時(shí),會(huì)連續(xù)的讀出若干條記錄,這樣在下次讀文件時(shí)就可以直接從內(nèi)存的緩沖區(qū)讀取;同樣,每次寫(xiě)文件的時(shí)候也僅僅是寫(xiě)入內(nèi)存的緩沖區(qū),等滿(mǎn)足了一定的條件(如達(dá)到了一定數(shù)量或遇到特定字符等),再將緩沖區(qū)中的內(nèi)容一次性寫(xiě)入文件。這種技術(shù)大大增加了文件讀寫(xiě)的速度,但也給編程代來(lái)了一點(diǎn)兒麻煩。比如有一些數(shù)據(jù),認(rèn)為已經(jīng)寫(xiě)入了文件,實(shí)際上因?yàn)闆](méi)有滿(mǎn)足特定的條件,它們還只是保存在緩沖區(qū)內(nèi),這時(shí)用_exit()函數(shù)直接將進(jìn)程關(guān)閉,緩沖區(qū)的數(shù)據(jù)就會(huì)丟失。因此,要想保證數(shù)據(jù)的完整性,就一定要使用exit()函數(shù)
?
通過(guò)一個(gè)函數(shù)實(shí)例來(lái)看看它們之間的區(qū)別:?
函數(shù)實(shí)例1 : exit.c
#include<stdio.h> #include<stdlib.h>int main() {printf("using exit----\n");printf("This is the content in buffer\n");exit(0); }執(zhí)行結(jié)果為:
using exit----
This is the content in buffer
?
函數(shù)實(shí)例2:_exit.c?
#include<stdio.h> #include<stdlib.h>int main() {printf("using _exit--\n");printf("This is the content in buffer");_exit(0); }執(zhí)行結(jié)果為 :?
using _exit--?
?
printf函數(shù)就是使用緩沖I/O的方式,該函數(shù)在遇到“\n”換行符時(shí)自動(dòng)的從緩沖區(qū)中將記錄讀出。所以exit()將緩沖區(qū)的數(shù)據(jù)寫(xiě)完后才退出,而_exit()函數(shù)直接退出。?
大家也可以把函數(shù)實(shí)例2中的printf("This is the content in buffer");改為printf("This is the content in buffer\n")(即在printf中最后加一個(gè)\n看運(yùn)行結(jié)果是什么,為什么會(huì)產(chǎn)生這樣的結(jié)果呢?)?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的linux中进程退出函数:exit()和_exit()的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 运行一个程序时如何打印出执行程序的时间
- 下一篇: 什么事孤儿进程和僵死进程?