【Linux系统化学习】进程终止的奥秘

=========================================================================

个人主页点击直达:小白不是程序媛

Linux专栏:Liunx系统化学习

代码仓库:Gitee

=========================================================================

目录

获取函数返回值

退出码

进程退出的场景

错误码

信号终止异常代码

进程的终止

main函数直接return

exit函数

_exit函数


获取函数返回值

在C语言学习过程中,每次主函数或者自己写的函数都会返回一个值(return x),而且在main函数最后我们通常会返回0(return 0 ),那么这个值返回给谁呢?必须返回0吗?返回其他的数字不行吗?有什么用呢?

其实在Linux中我们可以使用指令拿到这个main函数最后的返回值

echo $?

int main()
{return 10;
}

我们什么也不干只需要在main函数中返回一个非0数,使用上面的指令获取;

 

其实在Liunx中 就相当于一个环境变量保存最近一次进程的返回值 。


退出码

在Linux中运行我们编写的程序相当于创建一个新的进程,我们又知道每个进程都有自己的父进程,这样就通了:当我们的代码运行完毕时进程会退出,子进程是由父进程创建用来完成某些任务的,子进程退出时父进程肯定要知道子进程任务完成得怎么样,因此子进程需要返回一些信息,这些信代表着子进程任务完成得怎样。

进程退出的场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

就像在现实生活中我们完成一些任务也只有这三种情况:任务完成了,拿到好的结果;任务完成了,没有拿到好结果;完成任务时因为一些突发状况没能完成,终止了;

在C语言中返回0代表success非0代表failed;这些0或者非0的数字就代表进程的退出码,每个不同的数字代表程序退出的不同原因这就是退出码

然而非0的数字又有很多,随便说一个数字我们也不知道是什么意思不是很便于人们理解;这个数字的意义可以自己定义,但是在C语言库中存在;

  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>                                                                                                                                                    18 int main()19 20 {21     int i =0 ;22     for(i =0 ;i<200 ;i++)23     {24         printf("%d %s\n",i,strerror(i));25     }26     return 10;38 }

 

总共有133退出码,每个退出码都有其指定的含义;

因此父进程通过获取子进程的退出码得知子进程运行结束后的结果。


错误码

编写程序时我们会使用各种的系统调用或者使用库函数,当然进行这些调用时也会出现调用失败,影响我们的程序运行。因此C语言中有一个宏常量errno代表我们进行系统的出错信息,调用结束后会自动设置;

    #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>5 #include<errno.h>18 int main()19 20 {21     printf("before : %d \n",errno);22     FILE *pf = fopen("data.txt","r");23     printf("before : %d \n",errno);24     printf("%s\n",strerror(errno));}

 

使用库函数打开一个文件时,当文件不存在时调用的库函数就要返回指定的数字也就是errno,代表着调用库函数结束的结果,配合strerror可以清楚的得到程序运行的结果的具体原因。

退出码与错误码

  • 错误码通常是衡量一个库函数或者一个系统调用一个函数的调用情况
  • 退出码通常时一个进程退出的时候,其自己退出的结果
  • 都是用来衡量函数、进程出错的详细原因。

信号终止异常代码

代码能运行结束是是上面的情况,还有一种特别严重的问题就是代码运行期间由于代码异常而造成的进程终止,代码异常时退出码或者错误码已经没有任何意义了。

  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>  5 #include<errno.h>   17   18 int main()  19 {20     int i = 10/0;21     return 0;   }

 

在编译期间就会报异常,运行这个代码会报浮点数异常;因为非法的操作,操作系统通过信号会终止这个进程;

因此一个进程是否出异常,我们只需要看有没有收到信号即可;


进程的终止

main函数直接return

  1 #include<stdio.h>  2 int func()  3 {  4     return 1;5 }6 int main()7 {8     func();                                                                                                                                                                            9     return 0;                                                                                                              10 }  

 

通过上面的实验我们我们可以得出结论:在其他函数中return,表示的是这个函数的调用结束而不是进程的终止; 

exit函数

我们对上面的程序进行修改,直接在main函数一开始调用exit函数;

  1 #include<stdio.h>2 int func()3 {4     return 1;5 }6 int main()7 {8     exit(30);                                                                                                                                                                        9     func();10     return 0;11 }

 

我们会发现exit会直接终止进程,不会执行后面的代码,且exit的参数为这个进程的退出码。 

_exit函数

相同点:

 exit函数和_exit函数都是用来终止进程的,参数都是此进程的退出码。

不同点:

  • exit()函数是库函数底层使用_exit函数包装起来的
  • _exit()函数是系统调用
  • exit()函数终止进程的时候,会自动刷新缓冲区。
  • _exit()函数终止进程的时候不会自动刷新缓冲区。

今天对Linux下进程的终止的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法。您三连的支持就是我前进的动力,感谢大家的支持!!!  

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

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

相关文章

玩转区域流量调配,详细解析GLSB是什么?

在互联网早期&#xff0c;由于网络不是很发达&#xff0c;流量也相对比较小&#xff0c;单体架构已经能足够满足需求。但伴随着互联网越来越&#xff0c;网站的流量请求甚至能达到上千亿。为了实现高可用&#xff0c;需要用到多台机器来提升处理流量的能力。在这种环境下&#…

PIE-Engine简介

PIE-Engine&#xff0c;是航天宏图基于云计算、物联网、大数据和人工智能技术自主研发的一站式地球科学大数据实时计算平台&#xff0c;平台构建了基于云原生的并行高效底层架构&#xff0c;助力地球科学应用的产业化发展。&#xff08;摘自官网&#xff09; 前天&#xff0c;我…

web前端开发网页制作html/css结课作业

效果图展示&#xff1a; 注意事项&#xff1a; 引用JQuery文件地址和图片地址要更换一下。 百度网盘链接&#xff1a; http://链接&#xff1a;https://pan.baidu.com/s/1wYkmLr7csjBwQY6GmlYm4Q?pwd4332 提取码&#xff1a;4332 html界面展示&#xff1a; main.css代码部…

写给工作6年的程序员的一封信

准大牛 &#xff1b;兄&#xff0c; 希望你不会反感我给你的这个特别的称号&#xff0c;我们程序员中的大部分工作到5~6年这个节骨眼上&#xff0c;不出意外的话…准大牛…了&#xff0c;此时的你技术能力正在成熟或者已然成熟&#xff1b;架构设计力初现峥嵘&#xff1b;创新能…

Linux中磁盘管理与文件系统

目录 一.磁盘基础&#xff1a; 1.磁盘的结构&#xff1a; 2.硬盘的数据结构&#xff1a; 3.硬盘存储容量 &#xff1a; 4.硬盘接口类型&#xff1a; 二.MBR与磁盘分区&#xff1a; 1.MBR的概念&#xff1a; 2.硬盘的分区&#xff1a; 为什么分区&#xff1a; 2.表示&am…

10-让Java性能提升的JIT深度剖析

文章目录 JVM的语言无关性解释执行与JITC1、C2与Graal编译器C1编译器C2编译器 分层编译(了解即可)热点代码热点探测方法调用计数器回边计数器 编译优化技术方法内联锁消除标量替换逃逸分析技术逃逸分析的原理逃逸分析 JVM的语言无关性 跨语言&#xff08;语言无关性&#xff0…

浅谈技术架构的演进过程

前言 最近在学习Redis、Doctor相关技术知识&#xff0c;它们与分布式系统有着很大的关系。 而对于分布式系统&#xff0c;它本身就是随着业务的不断推进&#xff0c;技术架构不断演进而得到发展和实现的。而所谓的分布式系统&#xff0c;实际上就是想办法引入更多的硬件资源&am…

python 异步Web框架sanic

我们继续学习Python异步编程&#xff0c;这里将介绍异步Web框架sanic&#xff0c;为什么不是tornado&#xff1f;从框架的易用性来说&#xff0c;Flask要远远比tornado简单&#xff0c;可惜flask不支持异步&#xff0c;而sanic就是类似Flask语法的异步框架。 github&#xff1…

系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和全局变量]

分类目录&#xff1a;《系统学习Python》总目录 闭包函数&#xff08;带有外围def作用域引用和嵌套的def&#xff09;常常可以实现相同的效果&#xff0c;特别是用于像被装饰的最初咱数这样的静态数据时。然而在下面这个例子中&#xff0c;我们也需要外层作用域中的一个计数器&…

{MySQL} 数据库约束 表的关系 新增删除 修改 查询

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数据库约束1.1约束类型&#xff1a;1.2 NULL约束1.3unique 唯一约束1.4 DEFAULT&#xff1a;默认值约束1.5 PRIMARY KEY&#xff1a;主键约束1.6 FOREIGN K…

Kaggle:数据科学竞赛的殿堂与个人成长的舞台

一、产品简介&#xff1a; 它是一个举办数据科学竞赛、托管数据库、编写和分享代码的在线平台。这个数据集就像一个超级大的信息库&#xff0c;包含了我们日常生活中的各种事情&#xff0c;比如电子游戏的销量啊&#xff0c;还有空气质量如何受到污染等等。这些信息都是现实中…

车载毫米波雷达及芯片新趋势研究1--毫米波雷达与其它车载传感器互补,研发及量产门槛较高

1.1 毫米波雷达是利用毫米波电磁波波束工作的雷达&#xff0c;车载是首要应用场景  毫米波雷达是一种以波长位于1-10mm、频率在30-300GHz的电磁波作为放射波的雷达传感器。  毫米波雷达利用毫米波波束进行工作。①检测障碍物时&#xff1a; 直接通过有无回波确认&#xff…

06-C++ 类和对象-多态

类与对象 多态 1. 简介 一个事物的多种形态&#xff0c;简称多态。 物的多态 同一个人在不同人面前&#xff0c;角色不同 如&#xff1a; 在父母面前在对象面前在朋友面前在同事面前 事的多态 同一种事情&#xff0c;在不同情况下展现不同 如&#xff1a; 吃饭 中国人 筷子 …

8天狂收6100颗星,可商用!东京工业、麻省理工等开源Stream Diffusion

加州大学伯克利分校、东洋大学、东京工业大学、麻省理工学院和筑波大学等研究人员&#xff0c;联合开源了一款创新性实时交互图像生成框架——Stream Diffusion。 Stream Diffusion的技术创新点在于&#xff0c;将传统的顺序去噪变成流批处理去噪&#xff0c;消除了漫长的等待…

vue项目hdr格式文件放在assets下rgbeloader.load获取不到问题解决

如下图 我再App.vue组件中这样写 艾特符号定位 告诉系统 要src下的assets下的xhdr下的xidis.hdr 但是运行项目 他会告诉你找不到这个资源 我们改一下 我们组件时 App.vue 与assets同在 src目录下 用 ./去找 这样也是找不到的 我们需要将它放在静态资源包public下 public路…

CDSP考取的价值:成为数据安全认证专家的好处

哈喽IT的朋友们&#x1f44b;&#xff0c;今天想和大家聊聊一个超级有用的专业认证&#xff1a;CDSP&#xff0c;也就是数据安全认证专家。如果你在数据安全领域或者对这方面感兴趣&#xff0c;这个认证绝对值得你去考取哦&#xff01; 1.&#x1f393;提升专业性&#xff1a;获…

MCEWMDRMNDBootstrap.dll文件丢失,软件游戏无法启动,怎样下载修复

不少小伙伴反馈&#xff0c;在打开某些游戏或软件的时候&#xff0c;Windows会提示“MCEWMDRMNDBootstrap.dll文件丢失&#xff0c;软件无法启动”&#xff0c;不知道应该怎样办&#xff1f; 首先&#xff0c;我们先来了解“MCEWMDRMNDBootstrap.dll文件”是什么&#xff1f; …

单片机开发从小工到专家

有道无术&#xff0c;术尚可求&#xff1b;有术无道&#xff0c;止于术 背景 向单片机嵌入式开发小伙伴推荐了几本书&#xff0c;阅读量破10 1. 适用范围 2. 书籍推荐 书籍推荐 3. 大师介绍 大师介绍 4. 大师书籍编写逻辑 25年大师出版的关于&#xff1a;嵌入式单片…

wireshark access/trunk/hybrid报文分析

1&#xff0c;access接口 发送带vlan的报文 wireshark交换机配置 [Huawei-GigabitEthernet0/0/1] [Huawei-GigabitEthernet0/0/1]port link-type access [Huawei-GigabitEthernet0/0/1]port default vlan 100 [Huawei-GigabitEthernet0/0/2]port link-type access [Huawei-Gig…

Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

目录 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 1.2、打包项目&#xff08;jar&#xff09; 1.3、编写 Dockerfile 文件&#xff0c;构建镜像 1.4、运行镜像并测试 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 a&#xff09;简…