【Linux】进程终止

简介: 【Linux】进程终止

思维导图

学习内容

      进程终止是进程控制里面的一个重要的知识,通过这一篇博客,我们可以学习到进程终止的概念,进程终止的三种情况,进程终止的退出码和退出信号,最后在来学习进程是如何进行终止的。

学习目标

  • 进程终止的概念
  • echo内建命名
  • 进程退出码
  • 进程终止的三种情况
  • 进程是如何进行终止

一、进程终止的概念

      在计算机系统中,进程是操作系统分配资源的基本单位,而进程终止则是指操作系统因为某种原因结束一个进程的执行。这可能是因为进程完成了某种任务,也可能是因为出现了错误或异常。

      创建一个进程的过程是:先创建一个内核的部分数据结构,再进行复制代码和数据。那么终止一个进程的过程是和创建一个进程的顺序是相反的,终止一个进程的本质是:释放曾经的代码和数据所占据的空间,释放内核数据结构。

二、echo 内建命令

      echo内建命令的概念:打印的是bash内部的变量数据。

      ?符号的意义:父进程bash获取到最近一个子进程退出的退出码,0表示正常退出,非0表示异常退出。这个返回值需要让父进程得到,告诉父进程,子进程将任务完成的怎么样。

      不是?符号可以将最近一个子进程退出的退出码获取吗?但是上图中为什么获取了两个不同的子进程退出的退出码。

      因为echo命令也是一个进程,当使用完echo命令后,变成了最近一次子进程,又因为echo命令正常退出,所以最近一次子进程退出的退出码是0。

三、进程退出码

3.1 strerror函数

3.1.1 strerror函数的用途获取指向错误信息字符串的指针。

3.1.2 strerror函数的介绍

#include <string.h>
char* strerror(int errnum)
// 返回值为char * 类型,指向描述错误错误的错误字符串的指针

3.1.3 利用strerror函数来获取C语言中所有的错误信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
  int errcode = 0;
  for(errcode = 0; errcode <= 255; errcode++)
  {
    printf("%d %s\n", errcode, strerror(errcode));
  }
  return 100;
}

3.2 父进程为什么要获取子进程的退出码?

      因为父进程要知道子进程完成任务的情况(成功或者失败,失败的原因是什么),要对子进程进行负责。

3.3 自定义退出码

      我们可以通过联合体为自定义退出码进行赋值,将退出码置为全局变量,在每一个函数的每一种结果中都需要将退出码进行修改,在通过接收退出码的值将退出码的值翻译为错误信息的字符串。

#include <stdio.h>
 
enum{
  Success = 0,
  Div_Zero,
  Mod_Zero,
};
 
int errcode = Success;
 
int Div(int a, int b)
{
  if(b == 0)
  {
    errcode = Div_Zero;
    return -1;
  }
  else{
    errcode = Success;
    return a / b;
  }
}
 
char* geterror(int errno)
{
  switch(errno)
  {
    case Success:
      return "Success";
    case Div_Zero:
      return "Div_Zero";
    case Mod_Zero:
      return "Mod_Zero";
    dafault:
      return NULL;
  }
}
 
int main()
{
  int tmp1 = Div(10, 1);
  printf("answer: %d Error: %s\n", tmp1, geterror(errcode));
  int tmp2 = Div(10, 0);
  printf("answer: %d Error: %s\n", tmp2, geterror(errcode));
  return 0;
}

四、进程终止的三种情况

4.1 通过进程的退出码决定的进程终止的情况

  • 代码跑完,结果正确
  • 代码跑完,结果不正确

4.2 通过进程的退出信号决定的进程终止的情况

最后一种情况:代码执行时,出现了异常,提前退出了,退出码没有意义。

  • 编译运行时,崩溃了,操作系统发现了你的进程做了不该做的事情,操作系统杀死了进程。
  • 一旦进程出现异常,退出码没有意义

进程异常的退出信号:

我们可以使用kill命令来显示进程异常的退出信号所代表的含义:

kill -l

现在我们可以通过做个实验,来查看进程异常退出是否需要错误信号。

#include <stdio.h>
#include <unistd.h>
 
int main()
{
  while (1)
  {
    printf("I am process, pid = %d\n", getpid());
    sleep(1);
  }
  return 0;
}

当代码中出现一些异常错误时,进程也会发出错误信号,杀死进程。

总结:判断一个进程的退出情况,我只需要检查进程是否出现异常;如果没有出现异常,就检查进程的退出码。衡量一个进程退出,我们只需要两个数字:退出码和退出信号

五、进程如何终止

  • main函数调用return表示进程终止(普通函数的return,是退出函数)
  • 代码调用exit函数,在进程退出后,会冲刷缓冲区
  • 系统调用_exit函数,在进程退出后,不会冲刷缓冲区

我们可以通过代码来观察现象:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main()
{
  printf("Hello world");
  exit(1);
  return 0;
}

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main()
{
  printf("Hello world");
  _exit(1);
  return 0;
}


相关文章
|
2月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
39 0
|
4月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
682 2
|
4月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
72 2
|
25天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
95 4
linux进程管理万字详解!!!
|
16天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
57 8
|
13天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
24天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
65 4
|
25天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
27天前
|
消息中间件 存储 Linux
|
2月前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
48 1