Shell程序退出状态码的命令详解

news2024/11/30 2:38:39

在本篇文章当中主要给大家介绍了一些常见的程序退出的状态码!并且给出一下例子帮助大家仔细理解,并且使用C语言和python语言实现获取子进程退出时候的退出状态码。

程序退出状态码

前言

在本篇文章当中主要给大家介绍一个shell的小知识——状态码。这是当我们的程序退出的时候,子进程会将自己程序的退出码传递给父进程,有时候我们可以利用这一操作做一些进程退出之后的事情,比如当程序执行失败或者被某个信号杀死我们就可以了解到,然后做出对应的措施。

状态码简介

上图是一个zsh的截图,当我们执行命令asdsad之后,因为没有这个命令,所以zsh(类似于bash的一种shell),输出没有找到这个命令,但是我们发现图中箭头➡️由绿色变成红色,表示程序不是正常退出。现在有一个问题是,zsh是怎么知道程序不是正常退出的呢?其实就可以根据子进程退出的状态推断。在文章的最后我们用C语言实现一下,看看如果在父进程接收子进程的退出的状态。

我们在命令行当中可以通过命令 echo $? 查看上一个进程退出时候的退出码,这里的上一个进程就是 ls 命令:

程序正常退出的时候退出码等于0。

退出码表

退出码含义例子解释
1一般的错误除以0一般的除以0的错误,执行没有权限的操作
2shell 内部操作失败通常是shell操作时候的命令错误,文章后面有一个例子演示
126执行不能够执行的文件/dev/random权限问题或者命令不能够执行
127命令没有找到非法或者不存在的命令执行一个系统当中不存在的命令,可以通过设置PATH环境变量
128+n错误的信号值Kill -9 PID杀死进程号为PID的进程,进程的退出码等于 128 + 9
130ctrl+c 之后进程的返回值和上一条一样ctrl+c的信号值等于2
其他退出码s不在范围之内exit(-1)如果退出码n不在0-255之内,那么程序退出之后的退出码为n&255,并且取低8位作为最终的结果

实例说明

退出码——1

除以0

执行没有权限的操作

上面直接进入root用户的目录,因为没有权限,查看进程的退出码等于1。

shell内部操作失败——退出码2

1

2

3

4

a=1

if [ $a -eq 1 ]

then

  echo hello world

比如对于上面的shell脚本是有语法错误的正确的语法还需要在最后加上fi,现在我们执行上面的脚本查看结果:

退出码126

当因为权限问题或者命令不可以执行那么进程的退出码就是126:

命令没有找到——退出码127

信号值——128+n(信号对应的数值)

我们可以使用kil -l 命令查看 linux 操作系统当中信号以及对应的数值:

 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX

当我们在命令行使用ctrl+c中断程序的执行的时候,这个正在执行的进程就会接受到SIGINT信号,根据上文这个信号对应的数值为2,因此程序的退出码等于130(128 + 2)。

下面是一个通过kill命令发送对应的信号的例子:

可以看到的程序的退出码是符号我们的预期的。

不在范围内不的退出码

不在范围内(0-255)的退出码,需要和 0xff 进行 & 操作,得到的结果作为无符号数作为最终的程序的退出码!

在上面的例子当中退出码256的二进制表示 1_0000_0000 他和 255(二进制表示为1111_1111)进行与操作得到的结果为1_0000_000,低8位等于0000_0000,因此最终的退出码等于0。

在上面的图当中-1的二进制表示等于1111_1111 因此最后得到的退出码等于1111_1111 = 255。

C/Python语言获取进程退出的状态码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdio.h>

  

int main() {

  

  if(fork() ==  0) {

    _exit(1);  // 子进程执行

  } else {

    // 父进程执行

    int status;

    wait(&status);         // WEXITSTATUS 这个宏就是获取子进程退出时候的退出码

    printf("status = %d\n", WEXITSTATUS(status));

  }

  return 0;

}

在上面的代码当中父进程执行的 wait 函数就是等待子进程的状态变化,当子进程退出的时候 wait 函数会返回,同时将子进程一些状态信息保存在 status 当中,然后我们就可以子进程传递给父进程最后的信息啦。其中 WEXITSTATUS 这个宏就是获取子进程退出时候的退出码!对应的 python 实现如下图所示:

1

2

3

4

5

6

7

8

9

10

import os

import sys

  

if __name__ == '__main__':

    pid = os.fork()

    if pid == 0:

        sys.exit(-1)

    else:

        pid, status = os.wait()

        print(os.WEXITSTATUS(status))

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

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

相关文章

Object.defineProperty用法

Object.defineProperty() 定义新属性和修改原有的属性 Object.defineProperty( obj&#xff0c;prop,descriptor) 翻译&#xff1a;对象.定义属性&#xff08;对象&#xff0c;属性名必须是字符写法&#xff0c;{ value:所有 }&#xff09; 创建一个对象&#xff1a; var o…

OSI七层参考模型和TCP/IP四层(五层)参考模型

OSI七层参考模型 OSI&#xff08;OSI&#xff0c;Open System Interconnection&#xff09;七层模型&#xff0c;是参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体&#xff0c;不仅…

泰勒展开式

泰勒展开式 文章目录泰勒展开式简介定义近似举例推导理解参考简介 泰勒公式&#xff0c;也称泰勒展开式&#xff0c;可以用来在局部范围内近似复杂函数。 通俗的讲&#xff1a; 设有一个复杂的未知函数f(x)f(x)f(x)&#xff0c;我们想要知道它在某个范围[a,b][a,b][a,b]内的值…

抽象工厂模式

思考抽象工厂模式 抽象工厂专注于产品簇的实现&#xff0c;主要是那些有关联关系的&#xff0c;如果只有一个产品的话就退化成了工厂方法模式 1.抽象工厂模式的本质 抽象工厂模式的本质:选择产品簇的实现。 产品簇&#xff08;Product family&#xff09;指具有相同或相似的功能…

Simulink电机控制代码生成-----关于PI控制器参数整定的一点总结

目录 PI控制器的参数整定方法 方法一&#xff1a; 方法二&#xff1a; 方法对比 总结 看过很多论文&#xff0c;对PI参数的整定方法五花八门&#xff0c;还有PI参数整定的口诀&#xff0c;所谓口诀就是试凑法。除了试凑法&#xff0c;本文提供另外两种方法来整定PI参数&am…

【JavaSE】类与对象--封装性

文章目录一、面向对象的三大特性二、封装性1.什么是封装性&#xff1f;2.为什么要有封装性&#xff1f;3.封装性的作用4.封装性的实现步骤5.访问限定修饰符一、面向对象的三大特性 面向对象的三个基本特征是&#xff1a;封装、继承、多态。 二、封装性 1.什么是封装性&#xf…

BLE学习(4):蓝牙地址类型和设备的隐私

蓝牙地址也被称为蓝牙MAC地址&#xff0c;它能唯一标识一个蓝牙设备的48位的值。在蓝牙规范中&#xff0c;它被称为BD_ADDR。蓝牙的地址类型可以分为两种&#xff1a;public addresses和random addresses&#xff0c;其中random addresses又可再细分为几类&#xff0c;如下图所…

centos7.8手动部署php环境 01 nginx1.8.0编译安装

环境说明&#xff1a; 一、使用电脑 MacBook Pro 二、ssh 工具 finalShell 三、本地虚拟机 VMware Fusion 四、服务器配置 CentOS 7.8 64位 ps&#xff1a;虚拟机安装CentOS省略 登录服务器 一、安装基础工具 yum install net-tools -y yum install wget -y二、将yum源更改为腾…

创新型智慧农业信息化系统建设方案

农业电信增值服务与农村信息化建设要充分考虑新的信息技术、移动通信技术带来的革命&#xff0c;尤其是三网融合、移动互联网、下一代互联网、物联网、云计算、移动支付等新型产品与业务对我们的影响。 存在问题 •网络覆盖基础差 仍然有很多行政村没有宽带网络的覆盖&#x…

TiDB HTAP

TiDB 数据库 HTAP 概述 HTAP技术 OLAP和OLTP带来了多副本的问题。 HTAP的要求 HTAP的架构 异步复制&#xff0c;不参与投票。 HTAP的特性 行列混合 列存支持基于主键的实时更新TiFlash作为列存副本OLTP和OLAP业务隔离 智能选择&#xff08;CBO自动或者人工选择&#xff09;…

IB数学的备战技巧有哪些?

去知名品牌院校进修是许多学员的理想&#xff0c;可是众所周知这些重点大学的入校规定是十分严谨的。因此许多学员为了更好地提高自身的入校概率&#xff0c;就报名参加了一些可以大大加分的国际课程内容和考試。在其中IB数学课则是最受众多学员钟爱的一个课程内容。近些年&…

PyTorch 官方库「上新」,TorchMultimodal 助力多模态人工智能

多模态人工智能是一种新型 AI 范式&#xff0c;是指图像、文本、语音、视频等多种数据类型&#xff0c;与多种智能处理算法相结合&#xff0c;以期实现更高的性能。 近日&#xff0c;PyTorch 官方发布了一个 domain library–TorchMultimodal&#xff0c;用于 SoTA 多任务、多模…

[Linux]----进程间通信之共享内存

文章目录前言一、system V共享内存原理二、创建共享内存关联和去关联共享内存进行通信三、基于管道进行共享内存通信四、临界资源五、信号量总结前言 基于上篇我们利用管道进行进程间通信的使用和实现&#xff0c;本篇将带大家通过共享内存进行进程间通信&#xff01; 正文开始…

R9.8-9.8-9.8-9.8A_特点

R9.8-9.8-9.8-9.8A_特点 R9.8-9.8-9.8-9.8A_特点哈威柱塞泵主要特点是高自吸转速&#xff0c;工作效率高&#xff0c;结构紧凑&#xff0c;工作压力高等。该泵可为工程机械、铲雪车、路堤割草机、柴油叉车、自驱式工作平台和农业机械中的执行元件等提供压力油。 哈威液压泵R9.…

LIRA: Learnable, Imperceptible and Robust Backdoor Attacks 论文笔记

论文信息 论文名称LIRA: Learnable, Imperceptible and Robust Backdoor Attacks作者Khoa Doan(Baidu Research)会议/出版社ICCV 2021pdf&#x1f4c4;在线pdf代码&#x1f4bb;pytorch其他该作者还有一篇攻击的论文&#xff0c;在线pdf 介绍 本文提出了一种新的攻击框架 LIR…

技术中台的定义、范围与内容

【摘要】中台不能算是一个新的概念,只不过把它从一个单一系统扩展到了企业内部所有系统和组织级(企业架构级)的概念。那么时下“中台”的本质究竟是什么?技术中台又该如何理解? 前台、中台、后台的概念早就有之,只不过不同的场景下有不同的内涵。前中后台是从应用系统架…

T293037 [传智杯 #5 练习赛] 白色旅人

题目描述 有一个物品队列 \frak BB&#xff0c;初始时为空。现在共有三种操作。每个操作会给定三个整数 \mathrm{op},x,yop,x,y&#xff0c;其中 \mathrm{op}op 表示操作种类&#xff0c;x,yx,y 是操作的参数。操作分为如下三种&#xff1a; 11&#xff1a;向 \frak BB 尾部添…

React 简书项目实战【3】实现搜索框动画

React 简书项目实战【3】实现搜索框动画 添加判断变量 header/index.js 核心代码 ... class Header extends Component {constructor(props) {super(props);this.state {focused: true}}render() { ...添加classname header/index.js 核心代码 搜索框和放大镜图标 <…

手把手教你如何用界面组件DevExpress WPF应用一个模板主题

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF组件包…

VR失重太空舱游乐设备|航空航天VR体验|VR航天航空体验馆

普乐蛙推出了十几种不同类型的VR航天航空体验设备&#xff0c;VR创意内容丰富好玩&#xff0c;360全景还原航空各个场景&#xff0c;体验享受航空中的失重、飞行、旋转等刺 激与乐趣;模拟月球、太空、空间站等丰富航天场景&#xff0c;近距离体验航天科幻十足的魅力;通过沉浸式…