进程(4)——进程终止【linux】

news2024/11/19 11:27:01

进程 (4)——进程终止【linux】

  • 一. 进程结束情况
    • i. 正常终止
    • ii. 出错终止
    • iii. 异常退出
  • 二. 进程返回值(针对正常和出错)
    • 2.1. 进程的退出方式
      • i. return
      • ii. exit
      • iii. _exit
    • 2.2. 查看C语言中的对应返回值的对应出错
    • 2.3 使用errno
    • 2.4 查看系统进程的返回值
  • 三. 进程信号(针对异常)


主要内容:
1.进程终止的情况
2.查看进程终止的结果

一. 进程结束情况

这里进程终止可以分成三种情况

i. 正常终止

正常就是程序正确完整的执行完了程序内容。

ii. 出错终止

出错终止就是程序执行了程序内容,出现了错误,但是程序终止了

iii. 异常退出

异常退出是产生错误,导致程序崩溃,程序被迫终止

二. 进程返回值(针对正常和出错)

我们知道进程正终止和出错终止程序都是正常终止了
那如何对这两个进行区分?

其实区分的方式就是我们平常写代码时不经意中写的一行代码

#include<stdio.h>
int main()
{
  printf("hello world");
  return 0;
}

这里就拿入门时候看吐的hello world来举例子

这里能清楚的看到
return表示了程序结束结果
这就是用来区分终止结果的代码了。

2.1. 进程的退出方式

这里我们就来了解一下进程终止的常见三种方式。

i. return

这个算是我们最常用的终止方式了

它的特点是终止程序后,会返回到上级函数中,程序会继续执行

#include<stdlib.h>
#include<stdio.h>
int test()
{
  int arr[10];
  int* i=(int*)malloc(sizeof(arr[10]));
  if(i==NULL)
  {
    return -1;
  }
  else
  {
    return 0;
  }

}
int main()
{
  if(test()==-1)
  {
    printf("error");
  }
  else
  {
    printf("success");
  }
}

这里随便写个代码

在这里插入图片描述

这里我们就能看到return的特殊性了。

ii. exit

正如上面我们说return特殊性
return带来返回值后程序还能继续执行

但是exit就不一样了,它执行后,不管在哪个函数,会直接终止进程

这里我们可以来做个实验

#include<stdlib.h>
#include<stdio.h>
void test()
{
  exit(0);
}
int main()
{
  test();
  printf("123");

}

在这里插入图片描述
这里我们能发现运行结果没有打印123
如果我们把exit换成return
肯定是能打出来123的
这就体现了return和exit的区别

iii. _exit

_exit和exit同样也有区别

别看就差了一个横杠,但是差距同样很大

_exit是系统中的一个调用接口
但是exit是C语言中自带的一个方法。

这里我们用一个代码就能展现出它们的差别了。

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

在这里插入图片描述

这里我们能看到结果是123

那如果我们换成_exit呢?

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

在这里插入图片描述

这里我们就能发现它并没有打印出123
这里就能体现出exit和_exit的区别了

这里要科普一个小知识,printf数据时,并不会直接将数据打印在屏幕上
而是会先将数据,放在缓存区中

所以这里我们也能看出它们的区别了:

exit会按照步骤一步一步正常的退出进程(清空缓存区等)
_exit则会直接进行退出

在这里插入图片描述

2.2. 查看C语言中的对应返回值的对应出错

这里表示程序正常运行很简单,返回值直接是0就行了

但是如果是出错终止,那就有很多种的错误
想要表示出分别是哪种错误,就要用不同的返回值来表示

但是要记住每一种返回值对应的错误很难
所以在C语言中也进行了对应返回值和对应错误整合
这里我们能进行查看

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

在这里插入图片描述
多的就不放出来了

2.3 使用errno

C语言中有errno.h,其中有一个全局变量errno
是专门用来存储上一次出错对应值的变量
这里我们直接来使用一下

#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
int main()
{
  int* i=(int*)malloc(1000*1000*1000*4);
  printf("error=%d %s",errno,strerror(errno));
}

在这里插入图片描述
这里我们能直接看到他的结果

errno的值是12
正好对应了存储空间不足的这个错误。

2.4 查看系统进程的返回值

这里我们就要用到一个指令了:
echo $?查看上个程序的返回值

这里我们可以来进行实验一下
在这里插入图片描述

这里能看到输出结果是No such file or director

因为linux内核使用C语言来写的,所以按道理应该和C一样

这里我们能看到C语言中对应的No such file or director
在这里插入图片描述
对应的返回值是2

那我们ls本质也是个进程,所以我们可以用echo $?来进行查看

是否返回值是2

在这里插入图片描述
结果正如我们想象

因为linux中有默认接口,将对应的错误码转换成对应错误
所以它会直接输出对应返回值的错误字符串

三. 进程信号(针对异常)

进程异常退出
这个部分我们先不细讲,后面在信号的时候会着重讲
这里就小提一下

进程异常崩溃退出
这个时候就说明程序发生了异常错误,这个时候连程序都没完整走完
所以这个时候程序的返回值就已经不重要

所以如果进程异常退出了,这个时候就不关心它的返回码了
但是要关心它为什么异常

这里我们就要知道异常的本质了

当程序异常的时候会被系统转化为信号,交给计算机硬件设备,进行处理

但是具体的信号之类的过程以后会专门出博客来讲。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1269864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#开发的OpenRA游戏之属性SelectionDecorations(13)

C#开发的OpenRA游戏之属性SelectionDecorations(13) 在前面分析SelectionDecorations属性类时,会发现它有下面这个属性: public class SelectionDecorations : SelectionDecorationsBase, IRender { readonly Interactable interactable; 它是定义了一个Interactabl…

Win中Redis部署与配置

1.下载msi版本 下载传送门 2.双击next-->next安装安装 3.密码配置以及开机自启 在配置文件中配置相应配置进行配置密码以及端口和ip port 6379指定 Redis 监听端口&#xff0c;默认端口为 6379&#xff0c;作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口&…

使用Java将yaml转为properties,保证顺序、实测无BUG版本

使用Java将yaml转为properties 一、 前言1.1 顺序错乱的原因1.2 遗漏子节点的原因 二、优化措施三、源码 一、 前言 浏览了一圈网上的版本&#xff0c;大多存在以下问题&#xff1a; 转换后顺序错乱遗漏子节点 基于此进行了优化&#xff0c;如果只是想直接转换&#xff0c;可…

Java中xml映射文件是干什么的

Java中的XML映射文件主要用于将Java对象与XML文档之间进行转换。它通常用于处理数据交换和存储&#xff0c;例如将Java对象转换为XML格式以便在网络上传输或保存到文件中&#xff0c;或者将XML文档解析为Java对象以进行处理。这种转换可以通过Java的JAXB&#xff08;Java Archi…

谱方法学习笔记-上(超详细)

谱方法学习笔记&#x1f4d2; 谱方法学习笔记-下(超详细) 声明&#xff1a;鉴于CSDN使用 K a T e X KaTeX KaTeX 渲染公式&#xff0c; KaTeX \KaTeX KATE​X 与 L a T e X LaTeX LaTeX 不同&#xff0c;不支持直接的交叉引用命令&#xff0c;如\label和\eqref。 KaTeX \KaT…

Java项目学生管理系统一前后端环境搭建

在现代的软件开发中&#xff0c;学生管理系统是一个常见的应用场景。通过学生管理系统&#xff0c;学校能够方便地管理学生的信息、课程安排和成绩等数据。本文将介绍如何使用Java语言搭建一个学生管理系统的前后端环境&#xff0c;并提供一个简单的示例。 1.环境搭建 学生管…

云时空社会化商业 ERP 系统 gpy 文件上传漏洞复现

0x01 产品简介 时空云社会化商业ERP&#xff08;简称时空云ERP&#xff09; &#xff0c;该产品采用JAVA语言和Oracle数据库&#xff0c; 融合用友软件的先进管理理念&#xff0c;汇集各医药企业特色管理需求&#xff0c;通过规范各个流通环节从而提高企业竞争力、降低人员成本…

数据结构---树

树概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 有一个特殊的结点&#xff0c…

7.浮点数转为整数【2023.11.29】

1.问题描述 给出一个浮点数&#xff0c;请将这个浮点数转换成整数。 2.解决思路 输入一个浮点数。 输出程序将浮点数转换为整数并输出。 3.代码实现 numfloat(input("请输入一个浮点数")) num1int(num) print(num1)4.运行结果

Unity引擎:创造无限可能的游戏开发平台

Unity引擎&#xff1a;创造无限可能的游戏开发平台 一、Unity引擎概述1.1 什么是Unity引擎&#xff1f;1.2 Unity引擎的特点和优势 二、Unity开发环境和工具2.1 Unity编辑器2.2 支持的平台2.3 脚本语言2.4 图形和音频工具 三、Unity游戏开发流程四、示例应用场景五、结论&#…

思维模型 达维多定律

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。持续创新&#xff0c;引领市场潮流。 1 达维多定律的应用 1.1 达维多定律应用之吉列公司&#xff1a;不断创新的刀片领导者 吉列公司是一家以剃须刀片而闻名的公司。自 1901 年推出首款安…

VR(Quest)保姆级教学(一)

本次课&#xff0c;带领大家配置环境&#xff0c;并发行你的第一款VR软件。带上你的头戴跟随我进入你自己的虚拟世界。 &#xff08;此处使用Unity2019.4.19f1&#xff09; 1.Unity选择&#xff08;https://unity.cn/releases/lts/2019&#xff09; 1.1添加模块 2.创建测试项…

ES6中对Set、Map两种数据结构的理解

Set、Map两种数据结构的理解 前言什么是集合&#xff1f;什么又是字典&#xff1f;区别&#xff1f; 一、Set理解增删改查add()delete()has()clear() 遍历keys方法、values 方法、entries 方法forEach() 方法扩展运算符和 Set 结构相结合实现数组或字符串去重实现并集、交集、…

C#,数值计算——插值和外推,径向基函数插值(RBF_multiquadric)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class RBF_multiquadric : RBF_fn { private double r02 { get; set; } public RBF_multiquadric(double scale 1.0) { this.r02 Globals.SQR(scale); } publi…

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具 名称: spring 命令执行 (CVE-2022-22947) 描述: Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问A…

【浅尝C++】运算符重载(含类的3大默认成员函数:赋值、取地址、const对象取地址运算符重载)

&#x1f388;归属专栏&#xff1a;浅尝C &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;在Linux与C中来回横跳&#xff0c;哪个学累了&#xff0c;就去学另外一个~~ 文章前言&#xff1a;本篇文章简要介绍C的运算符重载&#xff0c;同时接着…

科研学习|论文解读——Deep learning for anomaly detection in log data: a survey

摘要 自动日志文件分析能够及早发现系统故障等相关事件。特别是&#xff0c;自学习异常检测技术能够捕捉日志数据中的模式&#xff0c;然后向系统操作员报告意外的日志发生&#xff0c;而无需提前提供或手动建模异常场景。最近&#xff0c;越来越多的利用深度学习方法来实现此目…

TikTok区块链实践:数字社交媒体的去中心化未来

随着区块链技术的日渐成熟&#xff0c;数字社交媒体行业也在探索如何整合区块链&#xff0c;以推动去中心化发展。在这一潮流中&#xff0c;TikTok作为全球领先的短视频平台&#xff0c;积极实践区块链技术&#xff0c;探索数字社交媒体的未来。本文将深入探讨TikTok的区块链实…

Message全局提示(antd-design组件库)简单用法

1.Message全局提示 全局展示操作反馈信息。 2.何时使用 可提供成功、警告和错误等反馈信息。 顶部居中显示并自动消失&#xff0c;是一种不打断用户操作的轻量级提示方式。 组件代码来自&#xff1a; 全局提示 Message - Ant Design 3.本地验证前的准备 参考文章【react项目ant…

Anolis 安装 Conda 和 YoloV8

Anolis 安装 Conda 和 YoloV8 一 Conda 和 YoloV8 安装1.Conda 下载与安装2.YoloV8 安装 二.测试 一 Conda 和 YoloV8 安装 ## 1. anolis 安装 cv2 依赖库 yum install -y mesa-libGL.x86_64 ## Anaconda https://repo.anaconda.com/archive/ ## 重启终端查看版本 conda --ver…