如何将信号名称(string)转换为信号代码?

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

目前,我正在通过编写我自己的地图,看起来像这样:

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

但是,对于所有的信号来说,这是很乏味的。 所以,如果它存在的话,我正在寻找更优雅的方式。

不知道这是否是你所说的,但是: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 

你可以使用这样的命令行

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

它会为你写下你的地图。

使用C ++ 0x你可以使用初始化列表来使这个更简单:

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

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