如何在linux中打印信号名称(不是descr)

时间:2012-11-22 10:11:43

标签: linux signals libc

我需要在linux中按照其编号打印信号名称,但是strsignal(9)返回信号描述(“Killed”)但不返回名称 - SIGKILL。除了在源代码中插入预定义数组外,有没有办法获得这样的名称?

2 个答案:

答案 0 :(得分:1)

我想不出它的任何标准功能。您可以使用脚本生成函数:

echo "#include <signal.h>" |\
  g++ -E -dD -xc++ - |\
  awk '$2~/^SIG[A-Z]/ && $3~/[0-9]+/ { print "case "$2": return \""$2"\";" }' \
  > signal_to_str_cases.inc

然后在代码中:

#include <signal.h>

char const* signal_to_str(int signo) {
    switch(signo) {
    #include "signal_to_str_cases.inc"
    default: return "<unknown signo>";
    }
}

答案 1 :(得分:0)

上述的traceway解决方案确实很好,但是,如果您有多个具有相同编号的信号,则会出现问题。在这种情况下,代码不会编译,并会给你一个错误,例如&#34;重复的案例值&#34;。修复它的一种方法是不为重复值生成案例:

echo "#include <signal.h>" |\
    g++ -E -dD -xc++ - |\
    awk '$2~/^SIG[A-Z]/ && $3~/[0-9]+/ && !seen[$3]++ { print "case "$2": return \""$2"\";" }' \
    > signal_to_str_cases.inc