我正在编写一个程序,它从命令行读取信号的名称(例如SIGStop,SIGKILL等)并调用kill()系统调用来发送信号。 我想知道是否有一个简单的方法来将string转换为信号代码(在signal.h中)。
目前,我正在通过编写我自己的地图,看起来像这样:
signal_map["SIGStop"] = SIGStop; signal_map["SIGKILL"] = SIGKILL; ....
但是,对于所有的信号来说,这是很乏味的。 所以,如果它存在的话,我正在寻找更优雅的方式。
执行默认信号处理器
SIGCHLD信号处理
pipe道输出从“超时”到“wc -l”失败
XOPEN_SOURCE和信号处理
在linux中如何处理asynchronous信号?
POSIX定时器的运行频率是预期的两倍
用SIGTERM调用subprocess终止父进程,但用SIGKILL调用subprocess使父进程保持活动状态
致命错误:调用未定义的函数sem_get()
我如何编写处理信号的跨平台c ++?
即使系统崩溃,也能保持“几乎完整”的日志
不知道这是否是你所说的,但是:strerror()将错误代码转换为错误消息,类似的strsignal()将信号转换为信号消息。
fprintf(stdout,"signal 9: %sn",strsignal(9)); fprintf(stdout,"errno 60: %sn",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并保留自己的方式,则仍然可以使用预处理器魔术)。
总结以上是内存溢出为你收集整理的如何将信号名称(string)转换为信号代码?全部内容,希望文章能够帮你解决如何将信号名称(string)转换为信号代码?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)