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

server/2024/11/14 21:03:44/

目录

什么是进程终止

进程退出的场景

退出码

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.c2   gcc -o $@ $^3 .PHONY:clean4 clean:5   rm -f myprocess  
myprocess.c1 #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.c1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 //自定义枚举常量5 enum6 {7     Success = 0,8     Div_Zero,//19     Mod_Zero,//210 };//自定义退出码不出错为0,出错为!011 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     else34        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.ppmy.cn/server/36824.html

相关文章

语音识别--kNN语音指令识别

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

Cocos Creator UICanvas详解与2D游戏配置详解

前言 Cocos Creator是一款强大的2D游戏开发引擎&#xff0c;提供了丰富的工具和组件来帮助开发者快速制作出优秀的游戏作品。其中&#xff0c;UICanvas是Cocos Creator中一个非常重要的组件&#xff0c;用于管理游戏中的UI界面。 在本文中&#xff0c;我们将深入探讨Cocos Cr…

05-06 周一 Shell工程目录划分和开发最佳实践

05-06 周一 Shell工程目录划分和开发最佳实践 时间版本修改人描述2024年5月6日10:34:13V0.1宋全恒新建文档2024年5月6日11:07:12V1.0宋全恒完成 简介 之前楼主曾经完成过一个shell工程的开发&#xff0c;记得当时项目名称叫做campus-shell&#xff0c;主要是用来一键完成多个模…

【Qt QML】Qt Quick Scene Graph

Qt Quick 2是一个用于创建图形界面的库&#xff0c;它使用一个专门的场景图&#xff08;Scene Graph&#xff09;来进行渲染。通过使用OpenGL ES、OpenGL、Vulkan、Metal或Direct 3D等图形API&#xff0c;Qt Quick 2可以有效地优化图形渲染过程。使用场景图而不是传统的命令式绘…

卸载系统自带APP

Firefly RK3588 android 12自动多个系统软件&#xff0c;无法从UI界面进行手动删除。因此&#xff0c;考虑使用shell指令进行处理。 系统自动APP大多都安装在system/app目录下&#xff0c;且该目录多为只读。因此采用如下步骤&#xff0c; //Shell su adb shell su //重新挂载…

一文了解什么是SSL证书?——值得收藏

SSL证书&#xff0c;全称Secure Sockets Layer证书&#xff0c;是一种网络安全协议的实现方式&#xff0c;现在通常指的是其继任者TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;不过习惯上仍称为SSL证书。它的主要作用是确保互联网上的数据传输安全&am…

STM32F4xx开发学习_SysTick

SysTick系统定时器 SysTick属于CM4内核外设&#xff0c;有关寄存器的定义和部分库函数都在core_cm4.h这个头文件中实现&#xff0c;可用于操作系统&#xff0c;提供必要的时钟节拍 SysTick简介 SysTick是一个 24 位向下定时器&#xff0c;属于CM4内核中的一个外设&#xff0c;…

机器学习实践:超市商品购买关联规则分析

第2关&#xff1a;动手实现Apriori算法 任务描述 本关任务&#xff1a;编写 Python 代码实现 Apriori 算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握 Apriori 算法流程。 Apriori 算法流程 Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所…