Linux進程終止的N種方式詳解
前言
進程終止是操作系統(tǒng)中,進程的一個重要階段,他標志著進程生命周期的結(jié)束。在Linux下進程終止的方式有很多,接下來我會一一介紹。
一、進程終止的概念
進程終止是操作系統(tǒng)將正在運行的程序結(jié)束掉的過程。當進程終止時,操作系統(tǒng)會回收該進程所占用的系統(tǒng)資源,如內(nèi)存空間、文件描述符、CPU資源等,確保系統(tǒng)資源高效的利用。
二、進程終止的場景
這里我們僅介紹常見的進程終止場景
場景 | 原因 |
---|---|
任務(wù)完成 | 進程順利執(zhí)行完所有預(yù)設(shè)的任務(wù),達到結(jié)束點,自動請求操作系統(tǒng)終止 |
運行錯誤 | 進程執(zhí)行過程中遇到除零錯誤、越界訪問等 |
資源不足 | 進程向操作系統(tǒng)申請的內(nèi)存資源無法得到滿足 |
用戶手動終止 | 用戶通過命令行(kill命令)強制終止進程 |
總的來說會有下面三種退出場景:
1.代碼運行完畢,結(jié)果正確
2.代碼運行完畢,結(jié)果不正確
3.代碼異常終止
三、進程終止的實現(xiàn)
我們結(jié)合相關(guān)代碼,對上面的場景逐幀分析
3.1 程序退出碼
在我們平時寫的代碼中,main函數(shù)內(nèi)都會有依據(jù)return 0這表示著程序結(jié)束時返回0(不同的退出碼代表不同的涵義),這個零就是我們所寫程序的退出碼,但是當我們所寫的程序運行出錯時,它往往會給我們返回一個非零值,這時什么意思呢?首先我們要知道程序退出碼是干什么的:
程序退出碼是程序終止時返回給操作系統(tǒng)的一個整數(shù)值,用于指示程序的執(zhí)行結(jié)果。它的核心是為調(diào)用者提供清晰的狀態(tài)反饋,以便后續(xù)處理。
更詳細的內(nèi)容我會在下文穿插介紹
3.2 運行完畢結(jié)果正常
return 終止進程
這是我們接觸最多的一種方式:
#include<stdio.h> int main() { printf("I am process...\n"); return 0; }
當我們執(zhí)行這個程序后,我們只能看到程序運行的結(jié)果,程序退出碼呢?其實程序退出碼,返回是為了給他的父進程(這里的父進程就是bash
命令行)查看的,父進程創(chuàng)建出子進程來執(zhí)行程序時,它需要知道子進程執(zhí)行的結(jié)果(如成功、錯誤等)程序退出碼的作用就是反饋執(zhí)行狀態(tài),通常退出碼為零表示成功執(zhí)行,而非零值,表示不同類型的錯誤。我們可以通過這個命令查看程序退出碼:
echo $?
$?:保存的是最近一次進程退出時的退出碼
exit終止進程
想了解更多可以通過man手冊查看
exit(n)
直接終止進程并返回一個指定的退出碼,適用于需要立刻終止進程的場景:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> void test() { printf("I am process...\n"); //int *ptr=(int*)malloc(1000*1000*4); exit(11); printf("I am process...\n"); } int main() { test(); return 0; }
可以看到當程序執(zhí)行過,exit(11)
后程序直接退出,并返回指定退出碼,不再繼續(xù)向下執(zhí)行。
exit和return的區(qū)別
在主函數(shù)中兩者是等價的,但是在多層函數(shù)調(diào)用中,return
只表示當前所處函數(shù)調(diào)用完成,而exit
則會直接終止進程并返回程序退出碼,當我們的程序在被調(diào)用的函數(shù)中出錯時,我們就可以使用exit
直接終止程序而不是使用return
返回主函數(shù)再終止,在后面我會給出示例。
_exit終止進程
這個系統(tǒng)調(diào)用接口和exit
用法一樣,但是不同的是:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> void test() { printf("I am process..."); //int *ptr=(int*)malloc(1000*1000*4); _exit(11); printf("I am process...\n"); } int main() { test(); return 0; }
_exit
在終止進程時,不會刷新緩沖區(qū),而exit
會幫助進程刷新緩沖區(qū)的資源
注:在測試這一點時打印函數(shù)不可以加\n
,\n
會幫助我們刷新緩沖區(qū)資源。
3.3 運行完畢結(jié)果異常
strerror 函數(shù)
在介紹程序退出碼時我們說,不同的退出碼對應(yīng)著不同錯誤信息,那么我們該如何知道退出碼對應(yīng)的錯誤信息呢?在庫函數(shù)中存在strerror
函數(shù)可以幫助我們:
下面代碼打印出0~5
程序退出碼,所對應(yīng)的信息。
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> int main() { int i=0; for(;i<=5;i++) { printf("%d->%s\n",i,strerror(i)); } return 0; }
errno 全局變量
在C/C++中給我們提供了一個全局,當程序執(zhí)行錯誤時,系統(tǒng)會將變量值修改為對應(yīng)的錯誤碼,并返回(程序退出碼),我們可以配合strerror
函數(shù)之間打印出對應(yīng)的錯誤信息:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<errno.h> int main() { int *ptr=(int*)malloc(1000*1000*1000*4); if(ptr==NULL) { printf("malloc error,%d->%s\n",errno,strerror(errno)); } return 0; }
perror 函數(shù)
它就像一個簡化版的strerror
信息,可以直接輸出錯誤描述,格式為:
用戶自定義消息:錯誤描述
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<errno.h> int main() { int *ptr=(int*)malloc(1000*1000*1000*4); if(ptr==NULL) { perror("malloc error:"); } return 0; }
3.4 程序異常退出
這里的原因還是比較多的,今天我們先介紹kill
,我們可以使用kill
系統(tǒng)調(diào)用或命令強制終止進程:
kill命令
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<errno.h> int main() { printf("I am prcsess......\n"); sleep(100); return 0; }
這個好像不太好演示......
kill系統(tǒng)調(diào)用
第二個參數(shù)對應(yīng)的信號可以通過kill -l查看
#include<stdio.h> #include<stdlib.h> #include<signal.h> #include<unistd.h> int main() { pid_t id=fork(); if(id==0) { while(1) { printf("I am child,pid:%d,ppid%d\n",getpid(),getppid()); sleep(1); } } else if(id>0) { sleep(5); kill(id,SIGKILL); } else exit(1); return 0; }
總結(jié)
進程終止是我們在學習Linux系統(tǒng)部分比較重要的一節(jié),本篇我們主要介紹了進程退出碼的作用以及如何來獲取使用它,這對我們高效的編程有很大的幫助。
到此這篇關(guān)于Linux進程終止的N種方式詳解的文章就介紹到這了,更多相關(guān)Linux進程終止內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
虛擬機中ubuntu不能聯(lián)網(wǎng)問題的解決方法
這篇文章主要為大家詳細介紹了虛擬機中ubuntu不能聯(lián)網(wǎng)問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03Linux環(huán)境下生成openssl證書注意細節(jié)介紹
大家好,本篇文章主要講的是Linux環(huán)境下生成openssl證書注意細節(jié)介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12關(guān)于VPS內(nèi)存不足的一些說明和解決辦法
關(guān)于VPS內(nèi)存不足的一些說明和解決辦法,需要的朋友可以參考下。2011-11-11Linux宿主機下/容器下如何修改進程打開的文件句柄數(shù)(open files)
系統(tǒng)級的max-file和進程級的ulimit-n分別控制文件句柄的最大數(shù)量,系統(tǒng)級限制整個系統(tǒng),而ulimit-n只限制單個進程,當進程打開的文件句柄數(shù)超限時,會報“Too many files open”錯誤,可以通過特定命令查看和修改這些值2024-10-10在 RHEL8 /CentOS8 上建立多節(jié)點 Elastic stack 集群的方法
Elastic stack 俗稱 ELK stack,是一組包括 Elasticsearch、Logstash 和 Kibana 在內(nèi)的開源產(chǎn)品。Elastic Stack 由 Elastic 公司開發(fā)和維護。這篇文章主要介紹了如何在 RHEL8 /CentOS8 上建立多節(jié)點 Elastic stack 集群,需要的朋友可以參考下2019-09-09使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法
本篇文章主要介紹了使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03