当前位置: 首页 > news >正文

Linux 进程(八) 进程的退出码

        main 函数的返回值叫做进程的退出码。当进程成功退出的时候,我们一般用0来表示。进程失败的时候一般用非零来表示。我们使用不同的数字来表示进程退出时不同的失败原因。

        我们查看系统的有多少退出码以及其含义时需要用到strerror()  他的头文件和用法如下。

        通过一下代码来查看系统有多少退出码

#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
int main()
{int i = 0;for(i;i<200;i++){printf("%d:,%s\n",i,strerror(i));}return 0;
}

        我们可以看到系统大概有134个退出码,每个退出码都有其自己的含义。由于太长只列举出来前几个。

         echo $?  查看最近一个进程的退出状态,查看到的是0 表示的就是成功。

        同时我们还可以自己设置进程退出码以及它的含义。

enum{success=0,open_err,malloc_err
};const char* errorTodesc(int code)
{switch(code){case success:return "sucesss";case open_err:return "open_fail";case malloc_err:return "malloc_fail";dafault:return "unknow error";}}int main()
{int code = malloc_err;printf("%s\n",errorTodesc(code));return malloc_err;
}

       除了进程退出,还有函数退出。 main函数退出表示进程结束,而函数退出仅仅表示函数调用完毕。函数也是有返回值的。调用函数一般我们通常想看到两种结果,第一函数执行结果 成功,或者失败。第二函数的执行情况,如打开一个文件,如果成功会返回一个文件指针,如果失败就会返回NULL。如:

        打印出错误码,并且打印出错误原因。 

        通过以上我们列举的情况可以说明进程退出有三种情况

        1.程序执行完,结果是正确的。

        2.程序执行完,结果是错误的。

        3.程序执行完,程序就出现错误,结果无意义!!!

        综上所述,只有当程序执行完的时候,结果才有意义。

        进程出现退出是进程收到了异常的信号,每个信号都有不同的编号,每个编号都有自己的异常原因。

        我们可以通过kill -l 查看有哪些信号:

        我们这次主要了解 8 号 和 11号信号,8号信号相当与代码除0 ,而十一号信号相当于对野指针进行解引用。

exit:

        exit是终止进程 其中status:是进程退出时候的退出码。

        代码演示:

       该进程只跑1秒就退出。

        并且退出码显示为3。

        同时,如果在while循环中调用一个函数,并且调用exit() 那么进程也会同样退出的。如下:

        

        说明exit 是终止整个进程,在任意地方调用都是终止进程。

_exit 与 exit

        

        他们两个的功能是一模一样的,exit是c语言给我们提供的接口,而_exit是linux系统给我们提供的接口,那么二者有什么区别呢?

        看代码:

        程序停止了3秒然后hello linux ,hello gm 才被打印到屏幕上。

        _exit 并没有把hello linux ,hello gm 打印到屏幕上,

        这是因为_exit 没有刷新缓冲去,而exit刷新了缓冲区,这也是他们的区别。

那么exit 和_exit 是什么关系呢。

        exit 和 _exit 都是终止进程的,在整个系统中只有操作系统能够有权限来终止进程。

        而_exit是系统调用接口,exit是c语言提供的库函数,库函数是不能终止进程的,只有操作系统提供的系统调用才能够终止进程,那么他们的关系就比较明确了。

        就是exit在底层封装了_exit ,同时exit 中又添加了刷新缓冲区的功能。

        为什么语言层面要进行封装呢?

        第一:提高了语言的跨平台性。window系统,和Linux系统给我们提供的退出进程的接口肯定是不一样的(比如:函数名,函数参数,函数返回值)。所以Linux下的退出进程函数,在Windo ws下注定是跑不了的,造成代码的可移植性较差。所以c语言把系统调用接口在底层进行封装,在上层直接给一个exit函数。在Linux下使用Linux系统的调用接口给exit,在windows下使用windo ws的系统调用接口给exit,这样做在底层屏蔽了系统之间的差异,提高了可移植性、跨平台性。比如Java的虚拟机,python的命令行解释器,c/c++的库,都是为了解决跨平台而提出的解决方案。他们都会提供exit的功能,底层也封装了不同系统的系统调用接口。

        第二:提高代码的可读性,降低程序员使用的门槛。

相关文章:

Linux 进程(八) 进程的退出码

main 函数的返回值叫做进程的退出码。当进程成功退出的时候&#xff0c;我们一般用0来表示。进程失败的时候一般用非零来表示。我们使用不同的数字来表示进程退出时不同的失败原因。 我们查看系统的有多少退出码以及其含义时需要用到strerror() 他的头文件和用法如下。 通过一…...

Go语言中支持的internal目录配置与组织内私网包配置详解

Go 中的内部包 这里可能会有歧义 可能是 Go 的 internal 目录中的包也可能是指内部开发的包 函数和变量的可见性 对于函数和变量而言&#xff0c;有如下规则&#xff1a;1 &#xff09;小写字母开头的函数变量结构体只能在本包内访问2 &#xff09;大写字母开头的函数变量结…...

如何使用Nmap加强网络安全?

Nmap是Network Mapper&#xff08;网络映射器&#xff09;的缩写&#xff0c;是一个用于端口和IP扫描以及应用程序检测的开源工具。网络和系统管理员将其用于清点网络资产、管理服务升级计划和监视服务正常运行时间。 起初&#xff0c;它是作为一款Linux工具而开发的&#xff…...

LeetCode 2487. 从链表中移除节点:单调栈

【LetMeFly】2487.从链表中移除节点&#xff1a;单调栈 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-nodes-from-linked-list/ 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输…...

LabVIEW在高精度机器人视觉定位系统中的应用

在现代工业自动化中&#xff0c;精确的机器人视觉定位系统对于提高生产效率和产品质量至关重要。LabVIEW软件&#xff0c;以其卓越的图像处理和自动化控制功能&#xff0c;在这一领域发挥着重要作用。本案例将展示LabVIEW如何帮助开发和实现一个高精度的机器人视觉定位系统&…...

Arm CCA机密计算扩展

目录 Realms Realm World和Root World Arm TrustZone扩展和Arm RME之间有什么区别? 在《什么是机密计算?》中所述,Arm CCA允许您在阻止更高特权软件实体(例如Hypervisor)访问的同时部署应用程序或虚拟机(VM)。然而,通常由这些特权软件实体管理内存等资源。在这种情况…...

【Unity入门】热更新框架之xLua

目录 一、xLua概述1.1xLua简介1.2xLua安装 二、Lua文件加载2.1执行字符串2.2加载Lua文件2.3自定义loader 三、xLua文件配置3.1打标签3.2静态列表3.3动态列表 四、Lua与C#交互4.1 C#访问Lua4.1.1 获取一个全局基本数据类型4.1.2 访问一个全局的table4.1.3 访问一个全局的functio…...

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…...

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…...

如何成为ChatGPT 优质Prompt创作者

如何提问&#xff1f; 我想让你成为我的Prompt创作者。你的目标是帮助我创作最佳的Prompt&#xff0c;这个Prompt将由你ChatGPT使用。你将遵循 以下过程&#xff1a;1.首先&#xff0c;你会问我Prompt是关于什么&#xff1f;我会告诉你&#xff0c;但我们需要 通过不断的重复来…...

LeetCode第71题 - 简化路径

题目 以 Unix 风格给出一个文件的绝对路径&#xff0c;你需要简化它。或者换句话说&#xff0c;将其转换为规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xff1b;此外&#xff0c;两个点 &#xff08;…&#xff09; 表…...

VSCode上远程调试代码出现的问题

记录一下&#xff1a; 真的是汗流浃背了&#xff0c;师妹叫帮忙如何在VSCode上远程调试代码&#xff0c;一些自己已经经历过的问题&#xff0c;现在已经忘记了。又在网上一顿搜索&#xff0c;这次记录下吧。。。 出现以下问题&#xff1a; 1. 终端界面总是sh-4.4 $ &#xff…...

【langchain】入门初探实战笔记(Chain, Retrieve, Memory, Agent)

1. 简介 1.1 大语言模型技术栈 大语言模型技术栈由四个主要部分组成&#xff1a; 数据预处理流程&#xff08;data preprocessing pipeline&#xff09;嵌入端点&#xff08;embeddings endpoint &#xff09;向量存储&#xff08;vector store&#xff09;LLM 终端&#xff…...

《数据结构、算法与应用C++语言描述》- 平衡搜索树 -全网唯一完整详细实现插入和删除操作的模板类

平衡搜索树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_34Balanced search tree 概述 本章会讲AVL、红-黑树、分裂树、B-树。 平衡搜索树的应用&#xff1f; AVL 和红-黑树和分裂树适合内部存储的应用。 B-树适合外部存储的…...

网络路由跟踪工具

随着企业网络需求的增长&#xff0c;组织发现监控和管理其网络基础设施变得越来越困难。网络管理员正在转向其他工具和资源&#xff0c;这些工具和资源可以使他们的工作更轻松一些&#xff0c;尤其是在故障排除方面。 目前&#xff0c;网络管理员主要使用简单、免费提供的实用…...

设计模式 七大原则

1.单一职责原则 单一职责原则&#xff08;SRP&#xff1a;Single responsibility principle&#xff09;又称单一功能原则 核心&#xff1a;解耦和增强内聚性&#xff08;高内聚&#xff0c;低耦合&#xff09;。 描述&#xff1a; 类被修改的几率很大&#xff0c;因此应该专注…...

(1)(1.13) SiK无线电高级配置(一)

文章目录 前言 1 监控链接质量 2 诊断范围问题 3 MAVLink协议说明 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 &#xff01;Tip 大多数用户只需要 SiK Radio v2 中提供的基本…...

drf知识--10

接口文档 # 后端把接口写好后&#xff1a; 登录接口&#xff1a;/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接&#xff0c;对接第一个东西就是这个接口文档&#xff0c;前端照着接口文档开发 公司3个人&#xff…...

探索 Vue 实例方法的魅力:提升 Vue 开发技能(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

mysql死锁排查

查看正在进行中的事务 SELECT * FROM information_schema.INNODB_TRX;字段解释trx_id唯一事务id号&#xff0c;只读事务和非锁事务是不会创建id的trx_state事务的执行状态&#xff0c;值一般分为&#xff1a;RUNNING, LOCK WAIT, ROLLING BACK, and COMMITTING.trx_started事务…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...