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

news2024/12/23 4:55:10

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

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

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.coloradmin.cn/o/1343917.html

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

相关文章

如何像高级软件工程师一样使用vscode做开发

以一个真实的代码库为例&#xff0c;带您了解高级软件工程的关键原则是什么&#xff0c;以及如何充分利用vscode提供的各种特性来提高开发效率。您可以将学到的技巧和思想应用于任何项目。 视频地址&#xff1a; 如何像高级软件工程师一样使用vscode做开发 欢迎关注公众号&a…

ViT的极简pytorch实现及其即插即用

先放一张ViT的网络图 可以看到是把图像分割成小块&#xff0c;像NLP的句子那样按顺序进入transformer&#xff0c;经过MLP后&#xff0c;输出类别。每个小块是16x16&#xff0c;进入Linear Projection of Flattened Patches, 在每个的开头加上cls token和位置信息&#xff0c;…

云原生|对象存储|minio分布式集群的搭建和初步使用(可用于生产)

前言&#xff1a; minio作为轻量级的对象存储服务安装还是比较简单的&#xff0c;但分布式集群可以大大提高存储的安全性&#xff0c;可靠性。分布式集群是在单实例的基础上扩展而来的 minio的分布式集群有如下要求&#xff1a; 所有运行分布式 MinIO 的节点需要具有相同的访…

【Java 进阶篇】Redis 缓存优化:提升应用性能的不二选择

在现代的软件开发中&#xff0c;性能一直是开发者们追求的目标之一。对于数据库访问频繁、数据读取较慢的场景&#xff0c;使用缓存是提升性能的有效手段之一。而 Redis 作为一款高性能的内存数据库&#xff0c;被广泛用作缓存工具。本文将围绕 Redis 缓存优化进行详解&#xf…

《深入理解JAVA虚拟机笔记》并发与线程安全原理

除了增加高速缓存之外&#xff0c;为了使处理器内部的运算单元能尽量被充分利用&#xff0c;处理器可能对输入代码进行乱序执行&#xff08;Out-Of-Order Execution&#xff09;优化。处理器会在计算之后将乱序执行的结果重组&#xff0c;保证该结果与顺序执行的结果一致&#…

三台CentOS7.6虚拟机搭建Hadoop完全分布式集群(三)

这个是笔者大学时期的大数据课程使用三台CentOS7.6虚拟机搭建完全分布式集群的案例&#xff0c;已成功搭建完全分布式集群&#xff0c;并测试跑实例。 9 安装hbase 温馨提示&#xff1a;安装hbase先在master主节点上配置&#xff0c;然后远程复制到slave01或slave02 &#xf…

远程网络唤醒家庭主机(openwrt设置)

远程网络唤醒家庭主机&#xff08;openwrt设置&#xff09; 前提&#xff1a; 1.配置好主板bios的网络唤醒功能(网络教程自己百度一下找) 2.电脑开启网络唤醒功能(网络教程自己百度一下找) 3.路由器通过ddns实现域名和动态IP绑定内网穿透方法汇总_不修改光猫进行内网穿透-C…

【办公软件】Excel双坐标轴图表

在工作中整理测试数据&#xff0c;往往需要一个图表展示两个差异较大的指标。比如共有三个数据&#xff0c;其中两个是要进行对比的温度值&#xff0c;另一个指标是两个温度的差值&#xff0c;这个差值可能很小。 举个实际的例子&#xff1a;数据如下所示&#xff0c;NTC检测温…

JavaScript中实现页面跳转的几种常用方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在JavaScript中实现页面跳转的几种常用方法以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题…

2024收入最高的编程语言

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 1.Python Python 是最流行、用途最广泛的语言之一。它通常用于网络开发、数据科学、机器学习等。 以下是 Python 编程语言的一些主要用途&#xff1a; Web 开发&…

【AIGC科技展望】预测AIGC2025年的机会与挑战

2025年&#xff0c;AIGC的机会与挑战 在未来的五年里&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;将会成为一个越来越重要的领域。但是&#xff0c;伴随着机会而来的是挑战。在这篇文章中&#xff0c;我们将一起探讨AIGC的机会与挑战&#xff0c;并预测2025…

WinForm开发 - C# RadioButton(单选框) 设置默认选中或取消默认选中

WinForm开发中RadioButton组件使用过程中的小技巧。 1、属性界面操作 如果有多个组件&#xff0c;希望不显示默认选中单选框只需要将其Checked属性全部设置为False即可&#xff0c; 如果希望默认多个组件中显示默认选中&#xff0c;将其Checked属性设置为True。 2、代码实…

GEE错误——‘xxx‘ did not match any bands.

这里我们在进行影像展示的时候会出现下面的错误,主要的原因是我们虽然进行了波段运算,但是依旧无法加载,主要原因是我们没有将计算过后的波段信息进行添加到我们的一个多波段影像,这里我们首先来看看代码出现的错误提示。当然这里只是给出了主要的问题,其实在进行波段运算…

Java——猫猫图鉴微信小程序(前后端分离版)

目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手&#xff0c;所以做了一个对自己来说可以完成的…

ES6的默认参数和rest参数

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…

权重函数设计

1e4/(0.5*s^21*s1) 1.4125 抑制驱动器饱和 1e-4*(s1)/(0.001*s1) 10*(s10)/(s1000) 1e-6*(s1)/(0.001*s1) [0.01,0.1],[0.001,1] 0.5*(0.05*s1)/(0.0001*s0.01)

Android笔记(二十三):Paging3分页加载库结合Compose的实现分层数据源访问

在Android笔记&#xff08;二十二&#xff09;&#xff1a;Paging3分页加载库结合Compose的实现网络单一数据源访问一文中&#xff0c;实现了单一数据源的访问。在实际运行中&#xff0c;往往希望不是单纯地访问网络数据&#xff0c;更希望将访问的网络数据保存到移动终端的SQL…

windows高效的文件夹管理工具QTTabBar

1、介绍&#xff1a; 功能介绍视频https://www.bilibili.com/video/BV13y4y1V782/?spm_id_from333.880.my_history.page.click&vd_sourceef5003729aa0776908befb4d20108803 这个视频很坑&#xff0c;介绍了功能&#xff0c;但没介绍安装方法 2、下载&#xff1a; 下载链…

自检服务器,无需服务器、不用编程。

自检服务器&#xff0c;无需服务器、不用编程。 大家好&#xff0c;我是JavaPub. 这几年自媒体原来热&#xff0c;很多人都知道了个人 IP 的重要性。连一个搞中医的朋友都要要做一个自己的网站&#xff0c;而且不想学编程、还不想花 RMB 租云服务。 老读者都知道&#xff0c…