【Linux】进程终止

server/2024/10/18 14:27:47/

思维导图

学习内容

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

学习目标

一、进程终止的概念

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

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

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


http://www.ppmy.cn/server/28804.html

相关文章

信息时代的智慧导航:高效搜索、信息筛选与信任构建的全面指南!

文章目录 一、高效搜索&#xff1a;快速定位目标信息的秘诀二、信息筛选&#xff1a;去伪存真&#xff0c;找到有价值的信息三、信任构建&#xff1a;深入了解与直接沟通《搜索之道&#xff1a;信息素养与终身学习的新引擎》亮点内容简介目录获取方式 随着科技的飞速发展&#…

shell脚本,删除30天以前的日志,并将日志推送到nas,但运行出现/bin/bash^M。

删除30天以前的日志 将日志推送到nas中&#xff0c;然后删除pod中的日志 pod挂载到本地 运行出现/bin/bash^M 1、删除30天以前的日志&#xff1a; #! /bin/bash# 定义源日志目录 LOG_DIR/home/log/ # 删除日志 find $LOG_DIR -type f -name "*.log" -mtime 30 -exec…

Word图片被隐藏了怎么办?

背景 如下图&#xff0c;插入的图片被隐藏了 解决办法 选中图片&#xff0c;右上角有个图标&#xff0c;选择嵌入型 继续选中图片&#xff0c;在状态栏里的段落中&#xff0c;点击小箭头到设置里&#xff08;即段落设置&#xff09; 将行距改成单倍行距 完成

FANUC机器人SOCKET断开KAREL程序编写

一、添加一个.KL文件创建编辑断开指令 添加一个KL文件用来创建karel程序中socket断开指令 二、断开连接程序karel代码 PROGRAM SOC_DIS %COMMENT SOCKET断开 %INCLUDE klevccdf VAR str_input,str_val : STRING[20] status,data_type,int_val : INTEGER rel_val : REALBEGING…

PotatoPie 4.0 实验教程(30) —— FPGA实现摄像头图像中值滤波

中值滤波是什么&#xff1f; 图像的中值滤波是一种非线性图像滤波方法&#xff0c;它用于去除图像中的椒盐噪声或其他类型的噪声。中值滤波的原理是用每个像素周围的邻域中的中值来替代该像素的值。与均值滤波不同&#xff0c;中值滤波不会受到极端值的影响&#xff0c;因此在处…

CM3:lldb 调试 qemu 跑的程序

正文 环境&#xff1a;macOS M1。 QEMU可以通过启动一个GDB调试端口来允许使用GDB调试正在运行的虚拟机&#xff0c;我们要做的就是通过 gdb 或者 lldb 连接到这个端口&#xff0c;然后进行调试。 我们先写一个简单的CM3 程序&#xff1a; .equ STACK_TOP, 0x20000800.text.gl…

MWCNTs微纳米纤维膜的制备

MWCNTs微纳米纤维膜是一种由多壁碳纳米管&#xff08;MWCNTs&#xff09;与聚合物纤维复合而成的纳米纤维膜。这种材料结合了MWCNTs的良好性能和纳米纤维膜的高比表面积、高通量等特点&#xff0c;具有广泛的应用前景。 在制备过程中&#xff0c;首先需要对MWCNTs进行酸化处理和…

软件定义汽车落地的五大关键要素

1、架构升级 1.1 软件架构&#xff1a;分层解耦、服务化、API 接口标准化 随着企业向软件定义汽车开发方法的转变&#xff0c;软件架构也需要同步进行升级&#xff0c;引入面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;简称 SOA&#xff09;方法论。…