程序退出状态码前言在本篇文章当中主要给大家介绍一个shell的小知识——状态码 。这是当我们的程序退出的时候,子进程会将自己程序的退出码传递给父进程,有时候我们可以利用这一操作做一些进程退出之后的事情,比如当程序执行失败或者被某个信号杀死我们就可以了解到,然后做出对应的措施 。
状态码简介
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/2055221457-0.png)
文章插图
上图是一个zsh的截图,当我们执行命令asdsad之后,因为没有这个命令,所以zsh(类似于bash的一种shell),输出没有找到这个命令 , 但是我们发现图中箭头?由绿色变成红色,表示程序不是正常退出 。现在有一个问题是 , zsh是怎么知道程序不是正常退出的呢?其实就可以根据子进程退出的状态推断 。在文章的最后我们用C语言实现一下,看看如果在父进程接收子进程的退出的状态 。
我们在命令行当中可以通过命令 echo $? 查看上一个进程退出时候的退出码,这里的上一个进程就是 ls 命令:
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/205522J54-1.png)
文章插图
程序正常退出的时候退出码等于0 。
退出码表退出码含义例子解释1一般的错误除以0一般的除以0的错误,执行没有权限的操作2shell 内部操作失败
通常是shell操作时候的命令错误 , 文章后面有一个例子演示126执行不能够执行的文件/dev/random权限问题或者命令不能够执行127命令没有找到非法或者不存在的命令执行一个系统当中不存在的命令,可以通过设置PATH环境变量128+n错误的信号值Kill -9 PID杀死进程号为PID的进程,进程的退出码等于 128 + 9130ctrl+c 之后进程的返回值
和上一条一样ctrl+c的信号值等于2其他退出码s不在范围之内exit(-1)如果退出码n不在0-255之内 , 那么程序退出之后的退出码为n&255,并且取低8位作为最终的结果实例说明退出码——1除以0
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/2055224933-2.png)
文章插图
执行没有权限的操作
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/2055224O4-3.png)
文章插图
上面直接进入root用户的目录,因为没有权限 , 查看进程的退出码等于1 。
shell内部操作失败——退出码2a=1if [ $a -eq 1 ]then echo hello world比如对于上面的shell脚本是有语法错误的正确的语法还需要在最后加上fi,现在我们执行上面的脚本查看结果:
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/2055224S3-4.png)
文章插图
退出码126当因为权限问题或者命令不可以执行那么进程的退出码就是126:
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/2055223K3-5.png)
文章插图
命令没有找到——退出码127
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/2055222C6-6.png)
文章插图
信号值——128+n(信号对应的数值)我们可以使用kil -l 命令查看 linux 操作系统当中信号以及对应的数值:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX当我们在命令行使用ctrl+c中断程序的执行的时候,这个正在执行的进程就会接受到SIGINT信号,根据上文这个信号对应的数值为2,因此程序的退出码等于130(128 + 2) 。
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/20552215Y-7.png)
文章插图
下面是一个通过kill命令发送对应的信号的例子:
![Shell揭秘——程序退出状态码](http://img.zhejianglong.com/231018/2055224W9-8.png)
文章插图
可以看到的程序的退出码是符号我们的预期的 。
推荐阅读
- 六部恋爱甜甜电影推荐——冬天到了 一起恋爱吧 1. 这部电影也太好看了
- 0025:2011年NOIp普及组真题——瑞士轮题解
- 4 .NET 6学习笔记——如何在.NET 6的Desktop App中使用Windows Runtime API
- 学习ASP.NET Core Blazor编程系列八——数据校验
- 1 Redis—问题
- 自己动手写线程池——向JDK线程池进发
- 『现学现忘』Git分支 — 39、Git中分支与对象的关系
- 虚拟化_Vmware——敬请期待!
- 虚拟化_Xen——敬请期待!
- 『现学现忘』Git分支 — 38、Git分支介绍