退出状态可以是<0,255>
内部的整数。一些退出状态是通过sysexits.h
文件"标准化"的,有些将由POSIX shell创建,例如:
126 Command invoked cannot execute
127 "command not found"
128 Invalid argument to exit
128+n Fatal error signal "n"
不管标准化如何,这使得从126向上包括的状态无法使用,因为如果使用shell,调用者将无法区分>=126
的退出状态是由被调用者还是由shell生成的。
这个不敏感的范围是否一直到255(换句话说,信号标识符的范围是多少)?sysexits.h
具有
#define EX__MAX 78 /* maximum listed value */
这是什么意思?它是否只引用sysexits.h
文件,或者程序永远不应该以存在状态> 78
退出?(如果是,为什么?)
在Unix中,POSIX shell调用的程序可以使用的退出代码的安全范围是多少,以便调用者可以确保退出代码是由被调用者生成的,而不是由shell生成的?
正确的答案是从阅读手册页"man 2 wait"开始。这记录了整数返回值,其中包含一个用于退出代码的位字段,以及一个用于导致退出的信号的单独位字段。
在BSD派生的Unix上,信号是最低有效位中的7位字段。第8位表示是否转储了核心文件,接下来的8位是退出代码。退出代码没有真正的标准,除了0表示成功,1是最常见的失败。
但是,您应该检查系统头文件(通常是sys/wait.h)中的定义,并使用wait(2)手册页中记录的宏来提取部件。
请参阅http://www.tldp.org/LDP/abs/html/exitcodes.html
根据链接中显示的表格,退出代码1-2、126-165和255[1]具有特殊含义,因此对于用户指定的退出参数应避免使用。
我不确定您能否在shell脚本中做到这一点。好吧,你可以看看/proc/(pid)/status
中的State
值,但我从来没有依赖过它,所以我不能100%确定它总是有效的。
我将"正常"返回值与信号区分开来的方法是使用wait(2)
和宏WIFSIGNALED
。以下是如何使用它们的示例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t p;
int s;
p = fork();
if (p == 0)
execl("./the_program_to_test", "");
else
{
wait(&s);
if (WIFSIGNALED(s))
printf("Signal detectedn");
else
printf("No signal detectedn");
}
return (0);
}
您可以编写一个"包装器",为您的shell脚本提供一个组合信息(程序的退出状态+是否由信号生成)