广告
返回顶部
首页 > 资讯 > 操作系统 >Shell程序退出状态码的命令详解
  • 711
分享到

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

2024-04-02 19:04:59 711人浏览 独家记忆
摘要

目录程序退出状态码前言状态码简介退出码表实例说明退出码——1shell内部操作失败——退出码2退出码126命令没有找到——退出码127信号值&mda

目录
  • 程序退出状态码
    • 前言
    • 状态码简介
  • 退出码表
    • 实例说明
      • 退出码——1
      • shell内部操作失败——退出码2
      • 退出码126
      • 命令没有找到——退出码127
      • 信号值——128+n(信号对应的数值)
      • 不在范围内不的退出码
    • C/python语言获取进程退出的状态码
      • 总结

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

        程序退出状态码

        前言

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

        状态码简介

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

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

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

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

        程序正常退出的时候退出码等于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

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

        执行没有权限的操作

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

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

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

        a=1
        if [ $a -eq 1 ]
        then
          echo hello world

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

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

        退出码126

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

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

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

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

        信号值——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)。

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

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

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

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

        不在范围内不的退出码

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

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

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

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

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

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

        #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 这个宏就是获取子
        

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

        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))

        总结

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

        以上就是本篇文章的所有内容了,我是LeHung,我们下期再见!!!更多精彩内容合集可访问项目https://GitHub.com/Chang-LeHung/CSCore

        到此这篇关于Shell程序退出状态码的文章就介绍到这了,更多相关Shell退出状态码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

        --结束END--

        本文标题: Shell程序退出状态码的命令详解

        本文链接: https://www.lsjlt.com/news/99320.html(转载时请注明来源链接)

        有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

        本篇文章演示代码以及资料文档资料下载

        下载Word文档到电脑,方便收藏和打印~

        下载Word文档
        猜你喜欢
        • Shell程序退出状态码的命令详解
          目录程序退出状态码前言状态码简介退出码表实例说明退出码——1shell内部操作失败——退出码2退出码126命令没有找到——退出码127信号值&mda...
          99+
          2022-10-24
        • Shell退出状态码及其应用详解
          Shell 中运行的命令会使用0-255之间的整数值,作为退出状态码,并以此来告知shell该命令执行的状态。通常情况下,约定0代表命令成功结束,非0代表程序非正常退出。 典...
          99+
          2022-06-04
          Shell退出状态码 Shell状态码
        • Shell退出状态码的方法
          这篇文章主要讲解了“Shell退出状态码的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Shell退出状态码的方法”吧!Shell 中运行的命令会使用0-255之间的整数值,作为退出状态...
          99+
          2023-06-09
        • Shell $?获取函数返回值或者上一个命令的退出状态
          $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。 所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,这和C语言的...
          99+
          2022-06-04
          Shell $? 函数返回值 shell 上一条命令
        • 详解bash中的退出状态机制
          程序的退出状态 当一个程序结束时会向父进程报告自己的退出状态( exit status ). 通过传递 int 类型的变量给库函数 exit 或系统调用 _exit 可以设置当前程序的退出状态, 在 linux 中, ...
          99+
          2022-06-04
          bash 退出状态 bash 退出
        • Shell $?如何获取函数返回值或者上一个命令的退出状态
          这篇文章主要介绍“Shell $如何获取函数返回值或者上一个命令的退出状态”,在日常操作中,相信很多人在Shell $如何获取函数返回值或者上一个命令的退出状态问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S...
          99+
          2023-06-09
        • shell下time”命令的输出详解
          这篇文章主要讲解了“shell下time”命令的输出详解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell下time”命令的输出详解”吧!前言相信大家都知道bash下time是一个很有...
          99+
          2023-06-09
        • ps命令输出进程状态S+的含义解析
          最近发现一个问题,ps命令输出里面进程状态为S+的含义,网上好多文章都说是表明进程“位于在后台进程组”。 例如下面这个ps命令输出说明: D 不可中断 Uninterruptible sleep (usually ...
          99+
          2022-06-04
          ps命令进程状态 ps 命令S+
        • shell(bash)下“time” 命令的输出详解
          前言 相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便。但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定...
          99+
          2022-06-04
          详解 命令 shell
        • 详解Shell命令的执行顺序
          详解Shell命令的执行顺序?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Shell 从标准输入或脚本中读取的每一行称为管道(pipeline);它包含了一个或...
          99+
          2023-06-09
        • 详解Linux中退出编辑模式的命令
          vim 有三种模式,注意:这三种模式有很多不同的叫法,我这里是按照鸟哥的linux书中的叫法。 一般指令模式、编辑模式、指令列命令模式 1.vim 文件名      进入...
          99+
          2022-06-04
          Linux中退出编辑模式的命令 linux退出编辑
        • GPU状态监测 nvidia-smi 命令的用法详解
          目录今天详细解读一下 nvidia-smi 命令第二个命令:nvidia-smi -L在进行深度学习实验时,GPU 的实时状态监测十分有必要。 今天详细解读一下 nvidia-smi...
          99+
          2022-11-11
        • ps命令输出进程状态S+的含义是什么
          这篇文章主要介绍了ps命令输出进程状态S+的含义是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近发现一个问题,ps命令输出里面进程状态为S+的含义,网上好多文章都说是...
          99+
          2023-06-09
        • Golang实现程序优雅退出的方法详解
          目录1. 背景2. 常见的几种平滑关闭2.1 http server 平滑关闭2.2 gRPC server 平滑关闭2.3 worker 协程平滑关闭2.4 实现 io.Close...
          99+
          2022-11-13
        • android中Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)
          一、什么是Activity? 简单的说:Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面。在一个应用程序中通常由多个Activity构成,都会在Manifestx...
          99+
          2022-06-06
          activity Android
        • Shell脚本中多命令逻辑执行顺序的方法详解
          linux中可以使用分号“;”、双and号“&&”和双竖线“||”来连接多个命令。单"&"符号也算命令连接符号,只不过它是将其前面的命令放入后台执行,所以可以变相地实现命令并行执行。 1.分号";...
          99+
          2022-06-04
          shell脚本多命令执行顺序 shell执行顺序 shell逻辑命令执行顺序
        • 一文详解Java线程的6种状态与生命周期
          目录1.线程状态(生命周期)2.操作线程状态2.1.新创建状态(NEW)2.2.可运行状态(RUNNABLE)2.3.被阻塞状态(BLOCKED)2.4.等待唤醒状态(WAITING...
          99+
          2022-11-13
        • 在Laravel应用程序中,如何使用PHP数组来处理Shell命令的输出?
          在Laravel应用程序中,我们经常需要使用Shell命令来执行一些任务,例如在后台执行定时任务、更新数据库等。当我们执行这些命令时,我们通常需要将命令的输出结果进行处理,这时PHP数组就是一个非常方便的工具。 在本文中,我们将介绍如何使用...
          99+
          2023-08-25
          数组 shell laravel
        • Android编程实现捕获程序异常退出时的错误log信息功能详解
          本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能。分享给大家供大家参考,具体如下:很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误log来查看是什么原因引起的程序崩溃。但是...
          99+
          2023-05-30
          android 异常 错误
        • 如何解决Golang命令行程序中的中文乱码问题
          Golang是一种编程语言,被广泛用于网络编程、分布式编程以及云计算等领域。在使用Golang编写命令行程序时,可能会出现中文乱码的情况。这篇文章将介绍如何解决Golang命令行程序中的中文乱码问题。一、乱码问题产生的原因分析字符编码不一致...
          99+
          2023-05-14
        软考高级职称资格查询
        编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
        • 官方手机版

        • 微信公众号

        • 商务合作