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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用anaconda下载安装pytorch1.8.2+cudatoolkit11.1

用anaconda下载安装pytorch1.8.1cudatoolkit11.1 设置清华镜像下载&#xff1a; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda con…

【Linux】chage命令使用

chage命令 chage用来更改linux用户密码到期信息&#xff0c;包括密码修改间隔最短、最长日期、密码失效时间等。 语法 chage [参数] 用户名 chage命令 -Linux手册页 选项及作用 执行令 &#xff1a; chage --help 执行命令结果 参数 -d, --lastday 最近日期 …

Python圣诞树代码

Python圣诞树代码 # 小黄 2023/12/25import turtle as t # as就是取个别名&#xff0c;后续调用的t都是turtle from turtle import * import random as rn 100.0speed(20) # 定义速度 pensize(5) # 画笔宽度 screensize(800, 800, bgblack) # 定义背景颜色&#xff0c;可…

WPF 显示气泡提示框

气泡提示框应用举例 有时候在我们开发的软件经常会遇到需要提示用户的地方&#xff0c;为了让用户更直观&#xff0c;快速了解提示信息&#xff0c;使用简洁、好看又方便的气泡提示框显得更加方便&#xff0c;更具人性化。如下面例子&#xff1a;(当用户未输入账号时&#xff0…

Vue学习day_03

普通组件的注册 局部注册: 创建一个components的文件夹 在里面写上对应的.vue文件 在对应的vue里面写上对应的3部分 template写上对应的核心代码 盒子等 style 写上对应的css修饰 在App.vue里面进行引用 import 导包 格式是 import 起个名字 from 位置 在写一个component…

javaweb基础2.0 (持续更新中)

Day 10 : Responbody 将响应的实体类转为json发送给前端。RequestBody将request的json转为实体类给后端 修改未成功的可能是因为根据id 查询的时候&#xff0c;只查询了name字段&#xff0c;因为后面需要根据id 修改&#xff0c;所以还需查询id &#xff0c;不然前端不知道id也…

回归预测 | Python实现OOA-LightGBM基于人工鱼鹰优化算法优化LightGBM的多输入单输出数据回归预测模型 (多指标,多图)

回归预测 | Python实现OOA-LightGBM基于人工鱼鹰优化算法优化LightGBM的多输入单输出数据回归预测模型 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | Python实现OOA-LightGBM基于人工鱼鹰优化算法优化LightGBM的多输入单输出数据回归预测模型 &#xff08;…

STM32 ESP8266 物联网智能温室大棚 源码PCB原理图 设计文档

资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片&#xff0c;采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集&#xff0c;MQ-7一氧化碳传感器检测CO浓度&#xff0c;GP2Y101…

nginx日志常见报错解决

目录 一&#xff1a;报错 二&#xff1a;php查看后台内容有的栏目出现502&#xff1f; 三&#xff1a;413 Request Entity Too Large? 四&#xff1a;Request Header Or Cookie Too Large 400 一&#xff1a;报错 upstream prematurely closed connection while reading r…

Java之程序、进程、线程、管程和并发、并行的概念

文章目录 1. 进程与线程1.1 程序1.2 进程1.3 线程1.4 管程 2.并行与并发2.1 并发2.2 并行 1. 进程与线程 1.1 程序 程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。简单的说就是我们写的代码。 1.2 进程 &#xff08;1&…

C# 使用ZXing.Net识别二维码和条码

目录 写在前面 代码实现 调用示例 写在前面 上一篇写了 C# 使用ZXing.Net生成二维码和条码-CSDN博客 使用ZXing.Net解码非常简单&#xff0c;事实上就只用一行代码就好了&#xff0c;这么简单那为什么还要贴在这里呢&#xff0c;原因是开始时&#xff0c;在网上看资料看到…

【项目管理】CMMI-项目总结报告模版

1、文档目录结构 2、计划与实际情况对比 3、开放工作评价

【每日一题】一周中的第几天

文章目录 Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 Tag 【模拟】【数学】【2023-12-30】 题目来源 1185. 一周中的第几天 解题思路 方法一&#xff1a;模拟 思路 题目中的日期是在 1971 到 2100 年之间的有效日期&#xff0c;即 1971-01-01 到 2100-12-31 范围…

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的志愿者…

GitHub 一周热点汇总 第3期 (2023/12/24-12/30)

GitHub一周热点汇总第三期 (2023/12/24-12/30)&#xff0c;梳理每周热门的GitHub项目&#xff0c;了解热点技术趋势&#xff0c;掌握前沿科技方向&#xff0c;发掘更多商机。元旦就要到了&#xff0c;提前祝大家新年快乐。 #1 StreamDiffusion 项目名称&#xff1a;StreamDiff…

AIGC开发:调用openai的API接口实现简单机器人

简介 开始进行最简单的使用&#xff1a;通过API调用openai的模型能力 OpenAI的能力如下图&#xff1a; 文本生成模型 OpenAI 的文本生成模型&#xff08;通常称为生成式预训练 Transformer 或大型语言模型&#xff09;经过训练可以理解自然语言、代码和图像。这些模型提供文…

Maven项目提示Ignored pom.xml问题

1 环境 &#xff08;1&#xff09;IDEA开发工具&#xff1a;2022.2.1 &#xff08;2&#xff09;JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09; &#xff08;3&#xff09;Spring&#xff1a;6.1.2 &#xff08;4&#xff09;Maven 3.8.8 2 …

vscode 支持c,c++编译调试方法

概述&#xff1a;tasks.jason launch.json settings.json一定要有&#xff0c;没有就别想跑。还有就是c 和c配置有区别&#xff0c;切记&#xff0c;下文有说 1.安装扩展插件。 2.安装编译器&#xff0c;gcc.我用的是x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z &#xf…

力扣LeetCode第80题 删除有序数组中的重复项 II

一、题目 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次&#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示…

后端程序员React初接触1

后端程序员React初接触 学习react基础与相关库的使用学习 包括react基础 路由 组件库等等 react是用于构建用户界面的JavaScript库 发送请求获取数据处理数据操作dom呈现页面&#xff08;react帮忙操作dom&#xff09; 数据渲染为视图 有facebook打造并开源 解决的问题 dom操…