C 复制Bash';s信号终止消息
现在我正在制作一个模拟Bash如何使用信号进行操作的程序。是否有更有效的方式打印终端信号终止消息(如“分段故障”、“非法指令”、“闹钟”等)?因为现在我脑子里只有一长串的if/else-if语句来迎合每个信号C 复制Bash';s信号终止消息,c,shell,signals,C,Shell,Signals,现在我正在制作一个模拟Bash如何使用信号进行操作的程序。是否有更有效的方式打印终端信号终止消息(如“分段故障”、“非法指令”、“闹钟”等)?因为现在我脑子里只有一长串的if/else-if语句来迎合每个信号 if((WIFSIGNALED(status) && ((WTERMSIG(status) != SIGINT)))){ ... else if(/*signal == 7*/){ fprintf(stderr, "Bus
if((WIFSIGNALED(status) && ((WTERMSIG(status) != SIGINT)))){
...
else if(/*signal == 7*/){
fprintf(stderr, "Bus error");
}
else if(/*signal == 8*/){
fprintf(stderr, "Floating point exception");
}
...
if(/*signal == 11*/){
fprintf(stderr, "segmentation fault ");
}
...
}
这似乎是在试图使用暴力。从
string.h
标题中尝试strsignal
,或从signal.h
中尝试psignal
。阅读他们的手册页以获取文档。如果您只需要原始描述,请使用@ZanLynx的解决方案
否则,通常和/或如果出于某种原因需要调整消息:替换if/else if
链或开关的通常方法是创建一个索引对应于条件的表,即:
const char * messages[] = {
...
"Bus error",
"Floating point exception",
"Segmentation fault",
...
};
然后,将原始代码替换为:
fprintf(stderr, messages[signal]);
令人惊叹的。这个答案实际上会让我在编码方面有更高的生活质量。我从来没有想过要做那样的事。为了提高生活质量,你甚至可以使用const char*messages[]={…}
@Lazarus:用数据结构替换代码?是的,学习是件好事。而strsignal
在C库中就是这样做的:手册页提到它使用了一个名为sys\u siglist
的数组。但是你应该使用这个函数。@wildplasser:的确!