c-Unix环境中可感知的退出状态;SIG_*范围



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

最新更新