程序退出状态码前言在这篇文章中,我主要介绍一点shell知识——状态码。这个就是当我们的程序退出的时候,子进程会把自己程序的退出码传递给父进程,有时候我们可以利用这个操作来做一些进程退出后的事情,比如当程序执行失败或者被接收asignal我们可以通过杀死它来了解它,然后采取相应的措施。状态码介绍上图是zsh的截图。我们执行命令asdsad后,因为没有zsh(类似bash的shell)这个命令,输出没有找到这个命令,但是我们发现图中的箭头??由绿色代表变成了红色,说明程序没有正常退出。现在有个问题,zsh怎么知道程序没有正常退出呢?其实可以根据子进程的退出状态来推断。文末我们用C语言实现一下,看看父进程是否收到子进程的退出状态。在命令行中,我们可以使用命令echo$?查看上一个进程退出时的退出码。这里前面的过程是ls命令:程序正常退出时exitcode等于0。退出码表退出码含义示例解释1一般错误除以0一般错误除以0,擅自执行操作2Shell内部操作失败通常是shell运行时的命令错误。文末有例子演示126不能执行。可执行文件/dev/随机权限问题或命令无法执行127CommandnotfoundIllegalornon-existentcommand要执行系统中不存在的命令,可以设置PATH环境变量128+n信号值错误kill-9PID杀死进程号为PID的进程。进程的退出代码等于128+9130ctrl+c。该过程的返回值与上一个相同。ctrl+c的signal值等于2,其他exitcodes不在exit(-1)范围内如果exitcoden不在0-255之间,那么程序退出后的exitcode为n&255,低8位作为最终结果。示例显示退出代码——1除以0执行未经许可的操作。以上直接进入root用户。目录,因为没有权限,查看进程的退出码等于1。shell内部运行失败-exitcode2a=1if[$a-eq1]thenechohelloworld例如上面的shell脚本,存在语法错误,正确的语法需要在末尾加上fi.现在我们执行上面的脚本查看结果:Exitcode126当进程的exitcode为126时由于权限问题或者命令无法执行:commandnotfound-exitcode127signalvalue-128+n(对应的值到信号)我们可以使用kil-l命令查看Linux操作系统中的信号和对应的值:1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM16)SIGSTKFLT17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN22)SIGTTOU23)SIGPUZ2FSIGGURGC24)SIGPUZ2FSIGGURGC24)27)SIGPROF1G3SGY)SIGWINCH23)SIOWS34)SIGRTMIN35)SIGRTMIN+136)SIGRTMIN+237)SIGRTMIN+338)SIGRTMIN+439)SIGRTMIN+540)SIGRTMIN+641)SIGRTMIN+742)SIGRTMIN+843)SIGRTMIN+944)SIGRTMIN+1045)SIGRTMIN+1146)SIGRTMIN+1247)SIGRTMIN+1348)SIGRTMIN+1449)SIGRTMIN+1550)SIGRTMIN+1451)SIGRTMAX-1352)SIGRTMAX-1253)SIGRTMAX-1154)SIGRTMAX-1055)SIGRTMAX-956)SIGRTMAX-857)SIGRTMAX-758)SIGRTMAX-659)SIGRTMAX-560)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-263)SIGRTMAX-164)SIGRTMAX当我们在命令行中使用ctrl+c中断程序的执行时,正在执行的进程会收到SIGINT信号,根据上述信号对应的值为2、所以程序的退出码等于130(128+2)。下面是通过kill命令发送相应信号的例子:可以看到程序的退出码就是我们期望的符号。Exitcodenotwithintherange没有exitcode不在范围内(0-255),需要用0xff进行&运算,得到的结果是一个无符号数作为程序最终的exitcode!在上面的例子中,exitcode256的二进制表示为1_0000_0000和255(二进制表示为1111_1111)结果为1_0000_000,低8位等于0000_0000,所以最终exitcode等于0。上图中,-1的二进制表示等于1111_1111,所以最终的退出码等于1111_1111=255。C/Python语言获取进程退出状态码#include
