建設(shè)部資質(zhì)上報(bào)系統(tǒng)網(wǎng)站/重慶百度推廣優(yōu)化
??
🕺作者:?主頁(yè)
我的專欄 C語(yǔ)言從0到1 探秘C++ 數(shù)據(jù)結(jié)構(gòu)從0到1 探秘Linux 菜鳥刷題集 😘歡迎關(guān)注:👍點(diǎn)贊🙌收藏??留言
🏇碼字不易,你的👍點(diǎn)贊🙌收藏??關(guān)注對(duì)我真的很重要,有問(wèn)題可在評(píng)論區(qū)提出,感謝閱讀!!!
前言
前面我們講述了使用fork函數(shù)進(jìn)行進(jìn)程的創(chuàng)建,既然有創(chuàng)建就有終止,那么本篇將向大家講述進(jìn)程終止的相關(guān)知識(shí)~
進(jìn)程終止與操作系統(tǒng)
進(jìn)程終止時(shí)操作系統(tǒng)做了什么呢?當(dāng)然是要釋放進(jìn)程申請(qǐng)的相關(guān)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和對(duì)應(yīng)的數(shù)據(jù)和代碼。本質(zhì)就是釋放系統(tǒng)資源。
進(jìn)程退出場(chǎng)景
進(jìn)程退出有三種場(chǎng)景如下:
- 代碼運(yùn)行完畢,結(jié)果正確
- 代碼運(yùn)行完畢,結(jié)果不正確
- 代碼異常終止
這里我們要展開講一下。在我們使用c語(yǔ)言進(jìn)行編程的時(shí)候,我們會(huì)注意到main函數(shù)的返回值,總是return 0,為什么總是0呢?因?yàn)樗?strong>進(jìn)程的退出碼。那他一定得是0嗎?并不是的。他返回這個(gè)數(shù)字的意義在于返回給你上一級(jí)進(jìn)程,用來(lái)評(píng)判該進(jìn)程執(zhí)行結(jié)果用的。如果非零值就說(shuō)明是,程序是有錯(cuò)誤的,非零值有無(wú)數(shù)個(gè),不同的非零值就可以標(biāo)識(shí)不同的錯(cuò)誤原因,所以它的作用就是在我們的程序運(yùn)行結(jié)束之后,結(jié)果不正確,可以方便我們定位錯(cuò)誤的原因細(xì)節(jié)。
舉個(gè)例子:
測(cè)試代碼:
#include <stdio.h>
#include <unistd.h>int main()
{int a[3]={0};printf("%d\n",a[1])//注意看,這里少了個(gè) ;return 0;
}
?這里還要介紹一個(gè)指令,它可以查看上一個(gè)進(jìn)程運(yùn)行錯(cuò)誤的原因。
echo $?
?返回2
是什么意思呢?別急!
我們先來(lái)查看一下這些“非零值”都代表著什么?
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{for(int number = 0; number < 150; number++){printf("%d: %s\n", number, strerror(number));//將數(shù)字代表的錯(cuò)誤原因展示出來(lái)} return 0;
}
查看結(jié)果:
進(jìn)程常見退出方法
正常終止(可以通過(guò) echo $? 查看進(jìn)程退出碼):
- 1. 從main返回
- 2. 調(diào)用exit
- 3. _exit
異常退出:
- ctrl + c,信號(hào)終止
_exit函數(shù)
#include <unistd.h>
void _exit(int status);
參數(shù):status 定義了進(jìn)程的終止?fàn)顟B(tài),父進(jìn)程通過(guò)wait來(lái)獲取該值
?說(shuō)明:雖然status是int,但是僅有低8位可以被父進(jìn)程所用。所以_exit(-1)時(shí),在終端執(zhí)行$?發(fā)現(xiàn)返回值是255。
exit函數(shù)
#include <unistd.h>
void exit(int status);
?exit最后也會(huì)調(diào)用_exit, 但在調(diào)用_exit之前,還做了其他工作:
1. 執(zhí)行用戶通過(guò) atexit或on_exit定義的清理函數(shù)。
2. 關(guān)閉所有打開的流,所有的緩存數(shù)據(jù)均被寫入
3. 調(diào)用_exit
?
?測(cè)試一下:
exit函數(shù)
#include<stdio.h>
#include <stdlib.h>
int main()
{printf("hello");exit(0);
}
運(yùn)行:
?
?_exit函數(shù)
#include<stdio.h>
#include <stdlib.h>
int main()
{printf("hello");_exit(0);
}
?運(yùn)行:
?因?yàn)槲覀冊(cè)O(shè)置的字符串后面沒(méi)有“\n”,也就是說(shuō)它會(huì)待在緩沖區(qū)中,然后我們會(huì)發(fā)現(xiàn)_exit函數(shù)會(huì)直接結(jié)束,而exit函數(shù)則是先把緩存區(qū)內(nèi)的數(shù)據(jù)沖刷出來(lái)才結(jié)束,其實(shí)exit是庫(kù)函數(shù),而_exit是系統(tǒng)接口,exit函數(shù)最后會(huì)調(diào)用操作系統(tǒng)的_exit函數(shù)。
這里給大家留下一個(gè)問(wèn)題,printf——\n數(shù)據(jù)保存在緩沖區(qū)中的,請(qǐng)問(wèn)緩沖區(qū)在哪里?誰(shuí)維護(hù)?但是我們知道它一定不在操作系統(tǒng)內(nèi)部,如果是操作系統(tǒng)維護(hù)的,緩沖區(qū)_exit就一定能夠刷出來(lái)!今天我只能告訴你是C語(yǔ)言標(biāo)準(zhǔn)庫(kù)給我們維護(hù)的。懂得的小伙伴可以在評(píng)論區(qū)打出一起交流~
return退出
return是一種更常見的退出進(jìn)程方法。執(zhí)行return n等同于執(zhí)行exit(n),因?yàn)檎{(diào)用main的運(yùn)行時(shí)函數(shù)會(huì)將main的返回值當(dāng)做 exit的參數(shù)。
后記
本篇我們主要講述了進(jìn)程的退出場(chǎng)景,進(jìn)程的終止,正常情況下它有三種退出的方式,異常情況可以使用ctrl+c的方式終止~