退出状态可以是<0,255>
内的整数。
一些退出状态是标准化的&#34;通过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
的退出状态是否为sysexits.h
由被调用者或shell生成。
这个不敏感的范围是否一直延伸到255(换句话说,信号标识符的范围是多少)?
#define EX__MAX 78 /* maximum listed value */
已
sysexits.h
这是什么意思?它是仅引用> 78
文件还是程序永远不会以状态import time
start = "2015-12-02"
start_date = time.strptime(start, "%Y-%m-%d")
end = "2015-12-02"
end_date = time.strptime(end, "%Y-%m-%d")
退出? (如果是这样,为什么?)
在Unix中退出代码的安全范围是什么,POSIX shell调用的程序可以使用,以便调用者可以确定退出代码是由被调用者生成的,而不是由shell生成的?
答案 0 :(得分:1)
对此的正确答案是首先阅读手册页&#34; man 2 wait&#34;。这记录了整数返回值,其中包含退出代码的位域,以及导致退出的信号的单独位域。
在BSD派生的Unix上,信号是最低有效位中的7位字段。第8位表示是否转储了核心文件,接下来的8位是退出代码。退出代码没有真正的标准,除了0表示成功,1表示最常见的故障。
但是,您应该检查系统头文件(通常是sys / wait.h)以获取定义,并使用wait(2)手册页中记录的宏来提取部件。
答案 1 :(得分:1)
请参阅此http://www.tldp.org/LDP/abs/html/exitcodes.html
根据链接中显示的表格,退出代码1 - 2,126-165和255 [1]具有特殊含义,因此应避免用户指定的退出参数。
答案 2 :(得分:0)
我不确定你是否可以在shell脚本中执行此操作。那么,您可以查看State
中的/proc/(pid)/status
值,但我从不依赖它,所以我无法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 detected\n");
else
printf("No signal detected\n");
}
return (0);
}
您可以编写一个“包装器”来为您的shell脚本提供一个组合信息(程序的退出状态+是否由信号生成)