1

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

4

2 回答 2

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>";
    }
}
于 2012-11-22T13:57:09.970 回答
0

上面的 scriptway 解决方案确实不错,但是,当您有多个具有相同编号的信号时,就会出现问题。在这种情况下,代码将无法编译,并且会给您一个错误,例如“重复大小写值”。解决它的一种方法是不为重复值生成案例:

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
于 2018-03-19T15:37:10.290 回答