如何将信号名称(字符串)转换为信号代码?

时间:2011-08-09 00:16:58

标签: c++ linux posix signals

我正在编写一个程序,它从命令行读取信号名称(例如SIGSTOP,SIGKILL等)作为字符串,并调用kill()系统调用来发送信号。我想知道是否有一种简单的方法将字符串转换为信号代码(在signal.h中)。

目前,我正在编写自己的地图,如下所示:

signal_map["SIGSTOP"] = SIGSTOP;
signal_map["SIGKILL"] = SIGKILL;
....

但是为所有信号写这个都很乏味。所以,我正在寻找一种更优雅的方式,如果存在的话。

3 个答案:

答案 0 :(得分:15)

不确定这是否是您要找的,但是: strerror()将错误代码转换为错误消息, 类似的strsignal()将信号转换为信号消息。

fprintf(stdout, "signal 9: %s\n", strsignal(9));
fprintf(stdout, "errno 60: %s\n", strerror(60));

Output:
signal 9: Killed
errno 60: Device not a stream

答案 1 :(得分:5)

您可以使用这样的命令行

kill -l \
        | sed 's/[0-9]*)//g' \
        | xargs -n1 echo \
        | awk '{ print "signal_map[\"" $0 "\"] = " $0 ";" }'

它将为您编写地图。

答案 2 :(得分:1)

使用C ++ 0x,您可以使用初始化列表使这更简单:

const std::map<std::string, signal_t> signal_map{ 
   {"SIGSTOP", SIGSTOP },
   {"SIGKILL", SIGKILL },
   ... 
};

这就是你在地图上写的更少的代码。如果你想要你也可以使用一些预处理器魔法来使代码更简单,并避免多次写入名称。但是,大多数情况下滥用预处理器只会导致代码更少,而不是更好的代码。 (请注意,如果您决定不使用C ++ 0x并保持自己的方式,仍然可以使用预处理器魔术。)