Unix环境中明智的退出状态; SIG_ *范围

时间:2015-12-10 11:48:13

标签: c shell unix

退出状态可以是<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生成的?

3 个答案:

答案 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脚本提供一个组合信息(程序的退出状态+是否由信号生成)