【Linux系統】Linux進程終止的N種方式

Linux系列


文章目錄

  • Linux系列
  • 前言
  • 一、進程終止的概念
  • 二、進程終止的場景
  • 三、進程終止的實現
    • 3.1 程序退出碼
    • 3.2 運行完畢結果正常
    • 3.3 運行完畢結果異常
    • 3.4 程序異常退出
  • 總結


前言

進程終止是操作系統中,進程的一個重要階段,他標志著進程生命周期的結束。在Linux下進程終止的方式有很多,接下來我會一一介紹。


一、進程終止的概念

進程終止是操作系統將正在運行的程序結束掉的過程。當進程終止時,操作系統會回收該進程所占用的系統資源,如內存空間、文件描述符、CPU資源等,確保系統資源高效的利用。

二、進程終止的場景

這里我們僅介紹常見的進程終止場景

場景原因
任務完成進程順利執行完所有預設的任務,達到結束點,自動請求操作系統終止
運行錯誤進程執行過程中遇到除零錯誤、越界訪問等
資源不足進程向操作系統申請的內存資源無法得到滿足
用戶手動終止用戶通過命令行(kill命令)強制終止進程

總的來說會有下面三種退出場景:
1.代碼運行完畢,結果正確
2.代碼運行完畢,結果不正確
3.代碼異常終止

三、進程終止的實現

我們結合相關代碼,對上面的場景逐幀分析

3.1 程序退出碼

在我們平時寫的代碼中,main函數內都會有依據return 0這表示著程序結束時返回0(不同的退出碼代表不同的涵義),這個零就是我們所寫程序的退出碼,但是當我們所寫的程序運行出錯時,它往往會給我們返回一個非零值,這時什么意思呢?首先我們要知道程序退出碼是干什么的:
程序退出碼是程序終止時返回給操作系統的一個整數值,用于指示程序的執行結果。它的核心是為調用者提供清晰的狀態反饋,以便后續處理。
更詳細的內容我會在下文穿插介紹

3.2 運行完畢結果正常

return 終止進程

這是我們接觸最多的一種方式:

  1 #include<stdio.h>2 int main()3 {4   printf("I am process...\n");                                                                                                    5   return 0;                                                                                                               6 } 

在這里插入圖片描述

當我們執行這個程序后,我們只能看到程序運行的結果,程序退出碼呢?其實程序退出碼,返回是為了給他的父進程(這里的父進程就是bash命令行)查看的,父進程創建出子進程來執行程序時,它需要知道子進程執行的結果(如成功、錯誤等)程序退出碼的作用就是反饋執行狀態,通常退出碼為零表示成功執行,而非零值,表示不同類型的錯誤。我們可以通過這個命令查看程序退出碼:

echo $?

$?:保存的是最近一次進程退出時的退出碼
在這里插入圖片描述

exit終止進程

想了解更多可以通過man手冊查看
在這里插入圖片描述

exit(n)直接終止進程并返回一個指定的退出碼,適用于需要立刻終止進程的場景:

  1 #include<stdio.h>  2 #include<stdlib.h>  3 #include<unistd.h>  4 void test()  5 {  6   printf("I am process...\n");  7   //int *ptr=(int*)malloc(1000*1000*4);  8   exit(11);9   printf("I am process...\n");                                                                               10 }                                                                                                            11 int main()                                                                                                   12 {                                                                                                            13   test();                                                                                                    14   return 0;                                                                                                  15 }         

在這里插入圖片描述
可以看到當程序執行過,exit(11)后程序直接退出,并返回指定退出碼,不再繼續向下執行。
exitreturn的區別
在主函數中兩者是等價的,但是在多層函數調用中,return只表示當前所處函數調用完成,而exit
則會直接終止進程并返回程序退出碼,當我們的程序在被調用的函數中出錯時,我們就可以使用exit直接終止程序而不是使用return返回主函數再終止,在后面我會給出示例。

_exit終止進程

在這里插入圖片描述
這個系統調用接口和exit用法一樣,但是不同的是:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<unistd.h>4 void test()5 {6   printf("I am process...");                                                                                                      7   //int *ptr=(int*)malloc(1000*1000*4);8   _exit(11);9   printf("I am process...\n");10 }11 int main()12 {13   test();14   return 0;15 }

在這里插入圖片描述
_exit在終止進程時,不會刷新緩沖區,而exit會幫助進程刷新緩沖區的資源
注:在測試這一點時打印函數不可以加\n\n會幫助我們刷新緩沖區資源。
在這里插入圖片描述

3.3 運行完畢結果異常

strerror 函數

在介紹程序退出碼時我們說,不同的退出碼對應著不同錯誤信息,那么我們該如何知道退出碼對應的錯誤信息呢?在庫函數中存在strerror函數可以幫助我們:
下面代碼打印出0~5程序退出碼,所對應的信息。

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<unistd.h>4 #include<string.h>5 int main()6 {7   int i=0;8   for(;i<=5;i++)9   {10     printf("%d->%s\n",i,strerror(i));                                                                                             11   }12   return 0;13 }

在這里插入圖片描述

errno 全局變量

在C/C++中給我們提供了一個全局,當程序執行錯誤時,系統會將變量值修改為對應的錯誤碼,并返回(程序退出碼),我們可以配合strerror函數之間打印出對應的錯誤信息:

     1 #include<stdio.h>2 #include<stdlib.h>3 #include<unistd.h>4 #include<string.h>5 #include<errno.h>6 int main()7 {8   int *ptr=(int*)malloc(1000*1000*1000*4);9   if(ptr==NULL)10   {11     printf("malloc error,%d->%s\n",errno,strerror(errno));                                                                      12   }13   return 0;14 }

在這里插入圖片描述

perror 函數

它就像一個簡化版的strerror信息,可以直接輸出錯誤描述,格式為:
用戶自定義消息:錯誤描述
在這里插入圖片描述

    1 #include<stdio.h>2 #include<stdlib.h>3 #include<unistd.h>4 #include<string.h>5 #include<errno.h>6 int main()7 {8   int *ptr=(int*)malloc(1000*1000*1000*4);9   if(ptr==NULL)10   {11     perror("malloc error:");                                                                                                    12   }                                                                          13   return 0;                                                                  14 }              

3.4 程序異常退出

這里的原因還是比較多的,今天我們先介紹kill,我們可以使用kill系統調用或命令強制終止進程:

kill命令

  1 #include<stdio.h>  2 #include<stdlib.h>  3 #include<unistd.h>  4 #include<string.h>  5 #include<errno.h>  6 int main()  7 {  8   printf("I am prcsess......\n");                                                                                                 9   sleep(100);                                                                                                              10   return 0;                                                                                                               11 }   

在這里插入圖片描述
這個好像不太好演示......

kill系統調用

在這里插入圖片描述
第二個參數對應的信號可以通過kill -l查看

  1 #include<stdio.h>2 #include<stdlib.h>                                                                                                                3 #include<signal.h>4 #include<unistd.h>5 int main()6 {7   pid_t id=fork();8   if(id==0)9   {10     while(1)11     {12 13        printf("I am child,pid:%d,ppid%d\n",getpid(),getppid());14        sleep(1);15     }16   }17   else if(id>0)18   {19     sleep(5);20     kill(id,SIGKILL);21   }22   else exit(1);23   return 0;24 }

在這里插入圖片描述

總結

進程終止是我們在學習Linux系統部分比較重要的一節,本篇我們主要介紹了進程退出碼的作用以及如何來獲取使用它,這對我們高效的編程有很大的幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898351.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

正則表達式引擎深入探討

正則表達式引擎&#xff08;Regular Expression Engine&#xff09;是正則表達式得以“活起來”的核心。它是一個精密的軟件組件&#xff0c;負責接收正則表達式和輸入文本&#xff0c;解析模式并執行匹配或替換操作&#xff0c;最終輸出結果——可能是簡單的“是否匹配”&…

java面試題,什么是動態代理?、動態代理和靜態代理有什么區別?說一下反射機制?JDK Proxy 和 CGLib 有什么區別?動態代理的底層

什么是動態代理&#xff1f; 動態代理是在程序運行期&#xff0c;動態的創建目標對象的代理對象&#xff0c;并對目標對象中的方法進行功能性增強的一種技術。 在生成代理對象的過程中&#xff0c;目標對象不變&#xff0c;代理對象中的方法是目標對象方法的增強方法。可以理解…

【工具類】Java的 LocalDate 獲取本月第一天和最后一天

博主介紹&#xff1a;?全網粉絲22W&#xff0c;CSDN博客專家、Java領域優質創作者&#xff0c;掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物…

嵌入式開發之STM32學習筆記day06

基于STM32F103C8T6的開發實踐——從入門到精通01 1. 引言 STM32系列微控制器是STMicroelectronics推出的一款高性能、低功耗的32位微控制器&#xff0c;廣泛應用于嵌入式系統中。STM32F103C8T6是其中非常受歡迎的一款&#xff0c;憑借其強大的性能、豐富的外設接口和低廉的價格…

學習使用 Git 和 GitHub 開發項目的教程推薦

Git 和 GitHub 是現代軟件開發中不可或缺的工具&#xff0c;無論你是個人開發者還是團隊成員&#xff0c;掌握它們都能極大提升效率。本文精選了一系列優質教程資源&#xff0c;涵蓋從基本 Git 命令到進階多人協作的內容。這些教程既有文字形式&#xff0c;也有視頻或交互式資源…

golang中的接口

1.簡介 在go中的接口是以一種類型,一種抽象的類型。接口(interface)是一組函數method的集合,go中的接口不能包含任何變量。在go中接口中的所有方法都沒有方法體,接口定義了一個對象的行為規范,只定義規范不實現。接口體現了程序的多態和高內聚低耦合的思想。go中的接口也是…

AI 浪潮下,職場的變與不變

如今&#xff0c;AI 如迅猛颶風&#xff0c;極速席卷職場&#xff0c;徹底攪亂了原有的秩序。你是否留意到&#xff0c;身邊的工作方式正悄然生變&#xff1f;今天&#xff0c;【探星 AI 研習社】就為大家深入剖析&#xff0c;AI 如何改寫職場劇本。無論你是大學生還是職場資深…

匯川EASY系列之以太網通訊(MODBUS_TCP做主站)

匯川Easy系列以太網通訊中(MODBUSTCP,plc做主站),終于可以不用使用指令就可以完成了,全程通過簡單的配置就可通訊。本文將通過EASY系列PLC與調試助手之間完成此操作。具體演示如下; 關于主站和從站的介紹 A/請求:即主動方 向被動方發送的一個要求的信息。 B/主站:發…

npm error gyp info

在使用 npm 安裝 Node.js 包時&#xff0c;可能會遇到各種錯誤&#xff0c;其中 gyp 錯誤是比較常見的一種。gyp 是 Node.js 的一個工具&#xff0c;用于編譯 C 代碼。這些錯誤通常發生在需要編譯原生模塊的 npm 包時。下面是一些常見的原因和解決方法&#xff1a; 常見原因及…

Oracle 19C分區表索引小結

一、大佬說&#xff08;楊廷琨&#xff09; LOCAL索引的最大好處是在進行分區操作&#xff0c;比如TRUNCATE PARTITION, DROP PARTITION時&#xff0c;不會出現索引INVALID的情況&#xff0c;不影響索引的可用性。由于GLOBAL索引所有的數據存儲在一起&#xff0c;因此當執行分…

AutoHub場景演示|帶您領略智能自動化操作的全新體驗

AutoHub是一款由OpenCSG推出的基于前沿大型語言模型&#xff08;LLM&#xff09;的瀏覽器自動化工具&#xff0c;旨在通過智能對話交互和自動化技術&#xff0c;幫助用戶更高效地瀏覽網頁和完成任務。它不僅能夠自動化繁瑣的網頁操作&#xff0c;還能夠為用戶提供精準的信息檢索…

深入解析 Linux 聲卡驅動:從架構到實戰

在嵌入式 Linux 設備中&#xff0c;音頻功能的實現離不開 Linux 聲卡驅動。而 ALSA (Advanced Linux Sound Architecture) 作為 Linux 內核的音頻框架&#xff0c;提供了一整套 API 和驅動模型&#xff0c;幫助開發者快速集成音頻功能。本篇文章以 WM8960 音頻編解碼器&#xf…

thinkphp5模型查詢數據庫,查出來的字段直接修改成另外的名字

在ThinkPHP5中,如果你希望在查詢數據庫時將返回的字段名直接修改為其他名稱,可以通過以下幾種方式實現: 方法1:使用 field 方法指定字段別名 在查詢時通過 field 方法直接為字段指定別名(使用 AS 關鍵字)。 示例代碼: // 使用Db類查詢 $result = Db::name(user)->…

關于前端指令

在前端開發中&#xff0c;指令&#xff08;Directives&#xff09;通常指在框架中使用的一種特殊的語法或機制&#xff0c;用于擴展 HTML 的功能。常見的指令主要存在于前端框架中&#xff0c;如 Vue.js、Angular 等。下面我們將分別介紹 Vue.js 和 Angular 中的常用指令&#…

虛擬地址空間(下)進程地址空間(上)

一.關于頁表組成 1.權限&#xff08;rwx) 作用&#xff1a;如1.讓代碼區變成只讀的 2.寫時拷貝的實現&#xff1a;子進程創建時其頁表指向的父進程代碼和數據權限都是只讀的&#xff0c;子進程試圖修改&#xff0c;觸發錯誤&#xff0c;系統開始寫時拷貝。 來源&#xff1a;…

【區塊鏈 + 航運物流】豐溯 - 區塊鏈溯源平臺 | FISCO BCOS 應用案例

豐溯是順豐科技推出的區塊鏈溯源平臺&#xff0c; 采用 FISCO BCOS 底層開源框架&#xff0c; 為農副食品、 冷鏈生鮮等企業客戶及消費 者提供關鍵流通節點的溯源信息服務&#xff0c;形成從源頭到消費者端全鏈路透明的信息鏈。 在商貿消費領域&#xff0c; 溯源一直是保障產品…

iwebsec-SQL數字型注入

1.判斷是否存在漏洞 添加and 11發現正常顯示&#xff0c;添加and 12無回顯條目&#xff0c;則存在sql注入漏洞 2.因為有回顯&#xff0c;嘗試union聯合注入&#xff0c;使用order by判斷出有3個字段 3.使用union聯合注入查看回顯位&#xff0c;發現3三個字段均有回顯&#xff…

藍橋杯每日五題第一日

藍橋杯每日5題 問題一 班級活動 1.班級活動 - 藍橋云課 問題描述 小明的老師準備組織一次班級活動。班上一共有 nn 名 (nn 為偶數) 同學&#xff0c;老師想把所有的同學進行分組&#xff0c;每兩名同學一組。為了公平&#xff0c;老師給每名同學隨機分配了一個 nn 以內的正…

STM32 —— 嵌入式系統、通用計算機系統、物聯網三層架構

目錄 一、嵌入式系統的概念 二、通用計算機系統與嵌入式系統的比較 用途 硬件 軟件 性能與功耗 開發與維護 三、嵌入式系統與物聯網的關系 四、物聯網的三層架構 1. 感知層&#xff08;Perception Layer&#xff09; 2. 網絡層&#xff08;Network Layer&#xff09; …

卡碼網25題——掌握ACM輸入輸出方式(15 至 18)

刷題小記&#xff1a; 本期涉及ACM模式下棧和鏈表的構建與使用&#xff0c;值得學習。 卡瑪網15.神秘字符&#xff08;卡瑪網15.神秘字符&#xff09; 題目分析&#xff1a; 若給定2行字符串&#xff0c;其中第一個串的長度為偶數&#xff0c;現要求把第二個串插入到第一個…