Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 复制Bash';s信号终止消息_C_Shell_Signals - Fatal编程技术网

C 复制Bash';s信号终止消息

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

现在我正在制作一个模拟Bash如何使用信号进行操作的程序。是否有更有效的方式打印终端信号终止消息(如“分段故障”、“非法指令”、“闹钟”等)?因为现在我脑子里只有一长串的if/else-if语句来迎合每个信号

   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:的确!