亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Linux進(jìn)程終止的N種方式詳解

 更新時(shí)間:2025年03月20日 11:09:35   作者:什么半島鐵盒  
進(jìn)程終止是操作系統(tǒng)中,進(jìn)程的一個(gè)重要階段,他標(biāo)志著進(jìn)程生命周期的結(jié)束,下面小編為大家整理了一些常見(jiàn)的Linux進(jìn)程終止方式,大家可以根據(jù)需求選擇

前言

進(jìn)程終止是操作系統(tǒng)中,進(jìn)程的一個(gè)重要階段,他標(biāo)志著進(jìn)程生命周期的結(jié)束。在Linux下進(jìn)程終止的方式有很多,接下來(lái)我會(huì)一一介紹。

一、進(jìn)程終止的概念

進(jìn)程終止是操作系統(tǒng)將正在運(yùn)行的程序結(jié)束掉的過(guò)程。當(dāng)進(jìn)程終止時(shí),操作系統(tǒng)會(huì)回收該進(jìn)程所占用的系統(tǒng)資源,如內(nèi)存空間、文件描述符、CPU資源等,確保系統(tǒng)資源高效的利用。

二、進(jìn)程終止的場(chǎng)景

這里我們僅介紹常見(jiàn)的進(jìn)程終止場(chǎng)景

場(chǎng)景原因
任務(wù)完成進(jìn)程順利執(zhí)行完所有預(yù)設(shè)的任務(wù),達(dá)到結(jié)束點(diǎn),自動(dòng)請(qǐng)求操作系統(tǒng)終止
運(yùn)行錯(cuò)誤進(jìn)程執(zhí)行過(guò)程中遇到除零錯(cuò)誤、越界訪問(wèn)等
資源不足進(jìn)程向操作系統(tǒng)申請(qǐng)的內(nèi)存資源無(wú)法得到滿足
用戶手動(dòng)終止用戶通過(guò)命令行(kill命令)強(qiáng)制終止進(jìn)程

總的來(lái)說(shuō)會(huì)有下面三種退出場(chǎng)景:

1.代碼運(yùn)行完畢,結(jié)果正確

2.代碼運(yùn)行完畢,結(jié)果不正確

3.代碼異常終止

三、進(jìn)程終止的實(shí)現(xiàn)

我們結(jié)合相關(guān)代碼,對(duì)上面的場(chǎng)景逐幀分析

3.1 程序退出碼

在我們平時(shí)寫(xiě)的代碼中,main函數(shù)內(nèi)都會(huì)有依據(jù)return 0這表示著程序結(jié)束時(shí)返回0(不同的退出碼代表不同的涵義),這個(gè)零就是我們所寫(xiě)程序的退出碼,但是當(dāng)我們所寫(xiě)的程序運(yùn)行出錯(cuò)時(shí),它往往會(huì)給我們返回一個(gè)非零值,這時(shí)什么意思呢?首先我們要知道程序退出碼是干什么的:

程序退出碼是程序終止時(shí)返回給操作系統(tǒng)的一個(gè)整數(shù)值,用于指示程序的執(zhí)行結(jié)果。它的核心是為調(diào)用者提供清晰的狀態(tài)反饋,以便后續(xù)處理。

更詳細(xì)的內(nèi)容我會(huì)在下文穿插介紹

3.2 運(yùn)行完畢結(jié)果正常

return 終止進(jìn)程

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

 #include<stdio.h>
  int main()
 {
     printf("I am process...\n");                                                                                                    
   return 0;                                                                                                               
  } 

當(dāng)我們執(zhí)行這個(gè)程序后,我們只能看到程序運(yùn)行的結(jié)果,程序退出碼呢?其實(shí)程序退出碼,返回是為了給他的父進(jìn)程(這里的父進(jìn)程就是bash命令行)查看的,父進(jìn)程創(chuàng)建出子進(jìn)程來(lái)執(zhí)行程序時(shí),它需要知道子進(jìn)程執(zhí)行的結(jié)果(如成功、錯(cuò)誤等)程序退出碼的作用就是反饋執(zhí)行狀態(tài),通常退出碼為零表示成功執(zhí)行,而非零值,表示不同類型的錯(cuò)誤。我們可以通過(guò)這個(gè)命令查看程序退出碼:

echo $?

$?:保存的是最近一次進(jìn)程退出時(shí)的退出碼

exit終止進(jìn)程

想了解更多可以通過(guò)man手冊(cè)查看

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

   #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;                                                                                                  
 }         

可以看到當(dāng)程序執(zhí)行過(guò),exit(11)后程序直接退出,并返回指定退出碼,不再繼續(xù)向下執(zhí)行。

exit和return的區(qū)別

在主函數(shù)中兩者是等價(jià)的,但是在多層函數(shù)調(diào)用中,return只表示當(dāng)前所處函數(shù)調(diào)用完成,而exit則會(huì)直接終止進(jìn)程并返回程序退出碼,當(dāng)我們的程序在被調(diào)用的函數(shù)中出錯(cuò)時(shí),我們就可以使用exit直接終止程序而不是使用return返回主函數(shù)再終止,在后面我會(huì)給出示例。

_exit終止進(jìn)程

這個(gè)系統(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在終止進(jìn)程時(shí),不會(huì)刷新緩沖區(qū),而exit會(huì)幫助進(jìn)程刷新緩沖區(qū)的資源

注:在測(cè)試這一點(diǎn)時(shí)打印函數(shù)不可以加\n\n會(huì)幫助我們刷新緩沖區(qū)資源。

3.3 運(yùn)行完畢結(jié)果異常

strerror 函數(shù)

在介紹程序退出碼時(shí)我們說(shuō),不同的退出碼對(duì)應(yīng)著不同錯(cuò)誤信息,那么我們?cè)撊绾沃劳顺龃a對(duì)應(yīng)的錯(cuò)誤信息呢?在庫(kù)函數(shù)中存在strerror函數(shù)可以幫助我們:

下面代碼打印出0~5程序退出碼,所對(duì)應(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++中給我們提供了一個(gè)全局,當(dāng)程序執(zhí)行錯(cuò)誤時(shí),系統(tǒng)會(huì)將變量值修改為對(duì)應(yīng)的錯(cuò)誤碼,并返回(程序退出碼),我們可以配合strerror函數(shù)之間打印出對(duì)應(yīng)的錯(cuò)誤信息:

     #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ù)

它就像一個(gè)簡(jiǎn)化版的strerror信息,可以直接輸出錯(cuò)誤描述,格式為:

用戶自定義消息:錯(cuò)誤描述

     #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)用或命令強(qiáng)制終止進(jìn)程:

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;                                                                                                               
  }   

這個(gè)好像不太好演示......

kill系統(tǒng)調(diào)用

第二個(gè)參數(shù)對(duì)應(yīng)的信號(hào)可以通過(guò)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é)

進(jìn)程終止是我們?cè)趯W(xué)習(xí)Linux系統(tǒng)部分比較重要的一節(jié),本篇我們主要介紹了進(jìn)程退出碼的作用以及如何來(lái)獲取使用它,這對(duì)我們高效的編程有很大的幫助。

到此這篇關(guān)于Linux進(jìn)程終止的N種方式詳解的文章就介紹到這了,更多相關(guān)Linux進(jìn)程終止內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 虛擬機(jī)中ubuntu不能聯(lián)網(wǎng)問(wèn)題的解決方法

    虛擬機(jī)中ubuntu不能聯(lián)網(wǎng)問(wèn)題的解決方法

    這篇文章主要為大家詳細(xì)介紹了虛擬機(jī)中ubuntu不能聯(lián)網(wǎng)問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Linux環(huán)境下生成openssl證書(shū)注意細(xì)節(jié)介紹

    Linux環(huán)境下生成openssl證書(shū)注意細(xì)節(jié)介紹

    大家好,本篇文章主要講的是Linux環(huán)境下生成openssl證書(shū)注意細(xì)節(jié)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Linux下執(zhí)行java程序的方法

    Linux下執(zhí)行java程序的方法

    本文通過(guò)圖文并茂的方式給大家介紹linux下執(zhí)行java程序的方法,想要在Ubuntu上運(yùn)行java程序,可以將java程序編譯成功后打包,然后在Ubuntu上用命令執(zhí)行jar文件,具體詳情請(qǐng)參考本文
    2016-10-10
  • 本地與linux互傳文件的方式詳解

    本地與linux互傳文件的方式詳解

    實(shí)現(xiàn)本地與Linux服務(wù)器文件互傳的常用方式:scp命令、sftp命令、lrzsz程序,xftp軟件,下面就跟隨小編一起來(lái)學(xué)習(xí)一下如何具體操作的吧
    2023-08-08
  • 關(guān)于VPS內(nèi)存不足的一些說(shuō)明和解決辦法

    關(guān)于VPS內(nèi)存不足的一些說(shuō)明和解決辦法

    關(guān)于VPS內(nèi)存不足的一些說(shuō)明和解決辦法,需要的朋友可以參考下。
    2011-11-11
  • Linux宿主機(jī)下/容器下如何修改進(jìn)程打開(kāi)的文件句柄數(shù)(open files)

    Linux宿主機(jī)下/容器下如何修改進(jìn)程打開(kāi)的文件句柄數(shù)(open files)

    系統(tǒng)級(jí)的max-file和進(jìn)程級(jí)的ulimit-n分別控制文件句柄的最大數(shù)量,系統(tǒng)級(jí)限制整個(gè)系統(tǒng),而ulimit-n只限制單個(gè)進(jìn)程,當(dāng)進(jìn)程打開(kāi)的文件句柄數(shù)超限時(shí),會(huì)報(bào)“Too many files open”錯(cuò)誤,可以通過(guò)特定命令查看和修改這些值
    2024-10-10
  • 在 RHEL8 /CentOS8 上建立多節(jié)點(diǎn) Elastic stack 集群的方法

    在 RHEL8 /CentOS8 上建立多節(jié)點(diǎn) Elastic stack 集群的方法

    Elastic stack 俗稱 ELK stack,是一組包括 Elasticsearch、Logstash 和 Kibana 在內(nèi)的開(kāi)源產(chǎn)品。Elastic Stack 由 Elastic 公司開(kāi)發(fā)和維護(hù)。這篇文章主要介紹了如何在 RHEL8 /CentOS8 上建立多節(jié)點(diǎn) Elastic stack 集群,需要的朋友可以參考下
    2019-09-09
  • CentOS7安裝GUI界面及遠(yuǎn)程連接的實(shí)現(xiàn)

    CentOS7安裝GUI界面及遠(yuǎn)程連接的實(shí)現(xiàn)

    這篇文章主要介紹了CentOS7安裝GUI界面及遠(yuǎn)程連接的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法

    使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法

    本篇文章主要介紹了使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Linux命令行快速技巧之定位一個(gè)文件的方法

    Linux命令行快速技巧之定位一個(gè)文件的方法

    Linux 命令行專門(mén)設(shè)計(jì)了很多非常有用的命令行工具在你的電腦上查找文件。下面我們看一下它們其中三個(gè):ls、tree 和 find。 感興趣的朋友跟隨小編一起看看吧
    2018-11-11

最新評(píng)論