我正在编写一个程序,它从命令行读取信号名称(例如SIGSTOP,SIGKILL等)作为字符串,并调用kill()系统调用来发送信号。我想知道是否有一种简单的方法将字符串转换为信号代码(在signal.h中)。
目前,我正在编写自己的地图,如下所示:
signal_map["SIGSTOP"] = SIGSTOP;
signal_map["SIGKILL"] = SIGKILL;
....
但是为所有信号写这个都很乏味。所以,我正在寻找一种更优雅的方式,如果存在的话。
答案 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并保持自己的方式,仍然可以使用预处理器魔术。)