【进程终止】概念理解 | 三种情况 | 退出码

news2024/11/28 20:56:35

目录

什么是进程终止

进程退出的场景

退出码

0退出码 

!0系统退出码 

非0自定义退出码


进程的终止从三个方面去谈。清楚进程终止是在做什么?进程终止的3中情况?如何终止?注意进程终止不是进程暂停。

什么是进程终止

❓进程终止是在做什么

回答:释放曾经的代码和数据所占据的空间。释放内核数据结构。

理解:在上篇进程的创建我们知道OS创建进程是先创建内核数据结构,再加载代码和数据。所以终止进程我们要先把代码和数据所占的空间归还给OS,再释放内核数据结构。(PCB task_struct会延期处理,此时进程处于Z状态僵尸状态)

main函数return相当于进程终止了。

进程退出的场景

 进程终止存在3种情况:

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

退出码

C/C++语言中main函数存在返回值return 0是什么意思❓为什么每次只写返回0呢❓可以换成其他值❓

  • ./ 创建启动进程命令行中启动的所有进程都是bash的子进程
  • 在bash的环境变量表中存在一个变量?变量名:?
  • 查看这个环境变量echo $? (访问变量内容)
  • ?里面是父进程获取到的,最近一个子进程的退出码。
  • main函数return的值是退出码
  • 0是成功
  • !0是标识失败
  • echo内建命令,但也是一个进程(用父进程执行的,没有创建新的子进程)
  • 如果子进程执行任务成功退出码是0
  • 如果子进程执行任务出现了失败是非0
  • !0不同的非0值,一方面表示失败,一方面表示失败的原因(每一个都有对应的错误描述)
  • 注意❗退出码表示的是代码是运行完毕,结果正确与否。
  • 0:代码运行完毕,结果正确
  • !0:代码运行完毕,结果不正确

理解:bash把任务交给子进程,在进程层面上,bash也需要知道任务执行的结果。(进程的退出码把子进程的退出结果给到父进程)

既然把子进程创建出来了,让父进程得到了进程退出信息,return值会通过一定方式让bash拿到(一定方式:进程等待)

Makefile                                                                                  
  1 myprocess:myprocess.c
  2   gcc -o $@ $^
  3 .PHONY:clean
  4 clean:
  5   rm -f myprocess  
myprocess.c
  1 #include<stdio.h>                                                                                            
  2 #include<unistd.h>
  3 int main()
  4 {
  5   printf("I am process,pid: %d,ppid: %d\n",getpid(),getppid());
  6   sleep(2);
  7   return 100;
  8 }

0退出码 

代码运行完毕,结果正确。

!0系统退出码 

!0:代码运行完毕,结果不正确

  • !0不同的非0值,一方面表示失败,一方面表示失败的原因
  • 每一个都有对应的错误描述)
  • 🆗失败原因可以是由系统OS来制定,OS实现错误码和错误信息的描述转化。
  • 查看退出码具体的系统的接口:man strerror
  • 用strerror查看系统定义的错误码char *strerror(int errnum)传入错误码,返回错误码相对应的错误描述。(gcc myprocess.c -o myprocess -std=c99)每个错误码都有对应的错误描述string。
  • 🆗失败原因也可以是由程序员自定义
  • 父进程bash为什么要得到子进程的退出码呢?因为要知道子进程退出的情况,是成功/失败/失败的原因是什么?为了给用户负责。用户需要知道。
  • 例如我们平时的指令也是一个可执行程序,这个可执行程序的也是存在返回码的。
  • 子进程退出码(1.系统默认 2.用户自定义)----------→父进程------------→用户

myprocess.c 
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 int main()
  5 {
  6   for(int errcode = 0; errcode <= 225; errcode++)
  7   {
  8     printf("%d:%s\n",errcode,strerror(errcode));
  9   }                                                                                              
 12 }

非0自定义退出码

  • 自定义退出码
  • 结合退出码给出相应的退出描述 
  • 无论是系统的/自定义的退出码 最终退出码都会给到父进程的环境变量?
myprocess.c
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 //自定义枚举常量
  5 enum
  6 {
  7     Success = 0,
  8     Div_Zero,//1
  9     Mod_Zero,//2
 10 };
    //自定义退出码不出错为0,出错为!0
 11 int exit_code = Success;
    //错误码对应定义错误描述
 12 const char *CodeToErrString(int code)
 13 {
 14     switch(code)
 15     {
 16         case Success:
 17             return "Success";
 18         case Div_Zero:
 19             return "div zero!";
 20         case Mod_Zero:
 21             return "mod zero!";
 22         default:                                                                                         
 23             return "unknow error!";
 24     }
 25 }
 26 int Div(int x, int y)
 27 {
 28     if( 0 == y )
 29     {                                                                                                    
 30        exit_code = Div_Zero;//修改错误码
 31        return -1;
 32     }
 33     else
 34        return x/y;
 35 }
 36 int main()
 37 {
 38     int result = Div(10, 100);                                                                           
 39     printf("result: %d [%s]\n", result, CodeToErrString(exit_code));
 40     result = Div(10, 0);
 41     printf("result: %d [%s]\n", result, CodeToErrString(exit_code));
 42 
 43     return exit_code;
 44 }

🙂感谢大家的阅读,若有错误和不足,欢迎指正。进程终止还有最后一种情况是代码异常终止。下篇进程信号和如何进程终止。

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

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

相关文章

Map集合的实现类~HashMap

存储结构&#xff1a;哈希表 键重复依据是hashCode和equals方法&#xff08;键不能重复&#xff09; 添加&#xff1a; 先创建Student类&#xff0c;那么往HashSet添加的就是Student对象作为键值&#xff0c;后面的作为值 删除&#xff1a; 判断&#xff1a; 遍历&#xff1a…

Android 系统启动流程源码分析

一、Init进程启动 是一个由内核启动的用户级进程。内核自行启动之后&#xff0c;就通过启动一个用户级程序init的方式&#xff0c;完成引导进程。 启动的代码init.c中的main函数执行过程&#xff1a;system\core\init.c中&#xff1a; 主要下面两个重要的过程&#xff1a; 1…

每日OJ题_贪心算法三⑤_力扣134. 加油站

目录 力扣134. 加油站 解析代码 力扣134. 加油站 134. 加油站 难度 中等 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一…

基于51单片机的ADC0804的电压表设计(仿真+源码+设计资料)

目录 1、前言 2、资料内容 3、仿真图 4、程序 资料下载地址&#xff1a;基于51单片机的ADC0804的电压表设计&#xff08;仿真源码设计资料&#xff09; 1、前言 最近看网上有很少的ADC0804的设计了&#xff0c;都由0809代替&#xff0c;但是有个别因为成本原因和学校课…

60、郑州大学附属肿瘤医院 :用于预测胃癌患者术后生存的深度学习模型的开发和验证[同学,我们的人生应当是旷野]

馒头老师要说的话&#xff1a; 我近期看了一下北京的脑机公司&#xff0c;大概是我之前对这一行业太过于乐观&#xff0c;北京的BCI公司和研究所&#xff0c;比上海、深圳、杭州甚至是重庆都要少&#xff0c;门槛也要高很多。也有我自己的原因&#xff0c;有时站的太高&#x…

LM4562NA 直插DIP8双运放 音频hifi运算放大器

LM4562NA是一款高性能音频运算放大器&#xff0c;其应用领域主要集中在音频和声音处理方面&#xff0c;包括但不限于&#xff1a; 1. 专业录音设备&#xff1a;在录音棚、广播电台和电视台等专业环境中&#xff0c;用于信号放大和处理&#xff0c;确保高质量的声音录制和传输…

Deep Learning Part Eight--Attention 24.5.4

01.在翻译、语音识别等将一个时序数据转换为另一个时序数据的任务中&#xff0c;时序数据之间常常存在对应关系 引入了Attention的概念&#xff0c;介绍了Attention的注意力机制&#xff1a; 困难出现&#xff0c;seq2seq的问题引入&#xff1a;固定化长度问题&#xff08;过于…

LeetCode 面试经典150题 252.会议室

题目&#xff1a;给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 思路&#xff1a;因为一个人在同一时刻只能参加一个会议&#xff0c;因此…

QGraphicsView实现简易地图10『自适应窗口大小』

前文链接&#xff1a;QGraphicsView实现简易地图9『层级缩放显示底图』 自适应窗口大小 当地图窗口放大或缩小的时候&#xff0c;需要地图能够动态覆盖整个视口。 1、动态演示效果 2、核心代码 注&#xff1a;WHMapView继承自MapViewvoid WHMapView::resize() {if (m_curLev…

Linux\_c输出

第一条Linux_c输出 初界面 : ls # 显示目录下的文件cd # 进入到某个目录 # 比如 我进入了Codels # 发现没有显示, 说明为文件下为空vim cpucdoe.c # 创建一个 .c的源码文件进入到了vim的编辑界面: i # 按i 就可以进行编辑 , 下面显示插入标识在编辑模式下, 可以通…

纯血鸿蒙APP实战开发——底部面板嵌套列表滑动案例

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表&#xff0c;分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”&#xff0c;弹出panel面板。在panel半展开时&#xff0c;手指向上滑动panel高度充满页面&#xff0c;手指向下滑动panel隐藏。在panel完全展开…

netty 高性能架构设计--零拷贝

文章目录 前言一、直接内存1.1 什么是直接内存1.2 代码实现1.3 使用直接内存的优缺点 二、netty 零拷贝设计2.1 netty 直接内存2.2 netty 内存池 三、零拷贝的两种方式 前言 本篇从源码层面剖析 netty 高性能架构设计之零拷贝&#xff0c;并且扩展讲述零拷贝的两种实现方式。 …

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

【C++STL详解(八)】--------stack和queue的模拟实现

目录 前言 一、stack模拟实现 二、queue的模拟实现 前言 前面也介绍了stack和queue的常见接口&#xff0c;我们也知道stack和queue实际上是一种容器适配器&#xff0c;它们只不过是对底层容器的接口进行封装而已&#xff0c;所以模拟实现起来比较简单&#xff01;一起来看看是…

FastDFS-单机扩容

描述 周一上班收到用户反馈系统异常&#xff0c;紧急排查日志发现报错&#xff1a;FdfsServerException:错误:28&#xff0c;错误信息:没有足够的存储空间。 解决 根据异常信息判断是文件服务器可用内存不够了&#xff0c;首先登录文件服务器&#xff0c;使用df -h命令查看一…

学习和分析各种数据结构所要掌握的一个重要知识——CPU的缓存利用率(命中率)

什么是CPU缓存利用率&#xff08;命中率&#xff09;&#xff0c;我们首先要把内存搞清楚。 硬盘是什么&#xff0c;内存是什么&#xff0c;高速缓存是什么&#xff0c;寄存器又是什么&#xff1f; 我们要储存数据就要运用到上面的东西。首先里面的硬盘是可以无电存储的&#…

VMware导入ova/ovf虚拟机文件

1.文件-打开-ova文件 2.为新虚拟机起名称 3.等待导入 4.导入完成&#xff0c;可以开始使用 参考链接&#xff1a;VMware导入ova/ovf虚拟机文件

C# OpenCvSharp 图片找茬

C# OpenCvSharp 图片找茬 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; namespace OpenCvSharp_Demo { public partial class Form1 : Form { …

初期Linux

一&#xff0c;系统分为 1.1window系统 个人 &#xff1a;win7&#xff0c;win8&#xff0c;Win10&#xff0c;Win11服务器版&#xff1a;window server 2003&#xff0c;window server 2008 1.2Linux系统 centos7redhatubantukali 1.3什么是Linux&#xff1f; Linux是基…

深入Django:用户认证与权限控制实战指南

title: 深入Django&#xff1a;用户认证与权限控制实战指南 date: 2024/5/7 18:50:33 updated: 2024/5/7 18:50:33 categories: 后端开发 tags: AuthDecoratorsPermissionsGuardianRESTAuthSessionMgmtMFA 第1章&#xff1a;入门Django与设置 1.1 Django安装与环境配置 在…