Linux进程终止的N种方式详解

2025-03-20 13:50

本文主要是介绍Linux进程终止的N种方式详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linux进程终止的N种方式详解》进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束,下面小编为大家整理了一些常见的Linux进程终止方式,大家可以根据需求选择...

前言

进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束。在linux下进程终止的方式有很多,接下来我会一一介绍。

一、进程终止的概念

进程终止是操作系统将正在运行的程序结束掉的过程。当进程终止时,操作系统会回收该进程所占用的系统资源,如内存空间、文件描述符、CPU资源等,确保系统资源高效的利用。

二、进程终止的场景

这里我们仅介绍常见的进程终止场景

场景原因
任务完成进程顺利执行完所有预设的任务,达到结束点,自动请求操作系统终止
运行错误进程执行过程中遇到除零错误、越界访问等
资源不足进程向操作系统申请的内存资源无法得到满足
用户手动终止用户通过命令行(kill命令)强制终止进程

总的来说会有下面三种退出场景:

1.代码运行完毕,结果正确

2.代码运行完毕,结果不正确

3.代码异常终止

三、进程终止的实现

我们结合相关代码,对上面的场景逐帧分析

3.1 程序退出码

在我们平时写的代码中,main函数内都会有依据return 0这表示着程序结束时返回0(不同的退出码代表不同的涵义),这个零就是我们所写程序的退出码,但是当我们所写的程序运行出错时,它往往会给我们返回一个非零值,这时什么意思呢?首先我们要知道程序退出码是干什么的:

程序退出码是程序终止时返回给操作系统的一个整数值,用于指示程序的执行结果。它的核心是为调用者提供清晰的状态反馈,以便后续处理。

更详细的内容我会在下文穿插介绍

3.2 运行完毕结果正常

return 终止进程

这是我们接触最多的一种方式:

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

Linux进程终止的N种方式详解

当我们执行这个程序后,我们只能看到程序运行的结果,程序退出码呢?其实程序退出码,返回是为了给他的父进程(这里的父进程就是bash命令行)查看的,父进程创建出子进程来执行程序时,它需要知道子进程执行的结果(如成功、错误等)程序退出码的作用就是反馈执行状态,通常退出码为零表示成功执行,而非零值,表示不同类型的错误。我们可以通过这个命令查看程序退出码:

echo $?

$?:保存的是最近一次进程退出时的退出码

Linux进程终止的N种方式详解

exit终止进程

想了解更多可以通过man手册查看

Linux进程终止的N种方式详解

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()                                                                                                   
  {                           http://www.chinasem.cn                                                                                 
    test();                                                                                                    
    return 0;                                                                                                  
 }         

Linux进程终止的N种方式详解

可以看到当程序执行过,exit(11)后程序直接退出,并返回指定退出码,不再继续向下执行。

exit和return的区别

在主函数中两者是等价的,但是在多层函数调用中,return只表示当前所处函数调用完成,而exit则会直接终止进程并返回程序退出码,当我们的程序在被调用的函数中出错时,我们就可以使用exit直接终止程序而不是使用return返回主函数再终止,在后面我会给出示例。

_exit终止进程

Linux进程终止的N种方式详解

这个系统调用接口和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;
  }

Linux进程终止的N种方式详解

_exit在终止进程时,不会刷新缓冲区,而exit会帮助进程刷新缓冲区的资源

注:在测试这一点时打印函数不可以加\n\n会帮助我们刷新缓冲区资源。

Linux进程终止的N种方式详解

3.3 运行完毕结果异常

strerror 函数

在介绍程序退出码时我们说,不同的退出码对应着不同错误信息,那么我们该如何知道退出码对应的错误信息呢?在库函数中存在strerror函数可以帮助我们:

下面代码打印出0~5程序退出码,所对应的信息。

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

Linux进程终止的N种方式详解

errno 全局变量

在C/C++中给我们提供了一个全局,当程序执行错误时,系统会将变量值修改为对应的错误码,并返回(程序退出码),我们可以配合strerror函数之间打印出对应的错误信息:

     #include&l编程t;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;
    }

Linux进程终止的N种方式详解

perror 函数

它就像一个简化版的strerror信息,可以直接输出错误描述,格式为:

用户自定义消息:错误描述

Linux进程终止的N种方式详解

     #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:");                                                                  python                                  
      }                                                                          
      return 0;                                                                  
    }www.chinasem.cn              

3.4 程序异常退出

这里的原因还是比较多的,今天我们先介绍kill,我们可以使用kill系统调用或命令强制终止进程:

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

Linux进程终止的N种方式详解

这个好像不太好演示......

kill系统调用

Linux进程终止的N种方式详解

第二个参数对应的信号可以通过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;
  }

Linux进程终止的N种方式详解

总结

进程终止是我们在学习Linux系统部分比较重要的一节,本篇我们主要介绍了进程退出码的作用以及如何来获取使用它,这对我们高效的编程有很大的帮助。

到此这篇关于Linux进程终止的N种方式详解的文章就介绍到这了,更多相关Linux进程终止内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Linux进程终止的N种方式详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153848

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1