【问题标题】:Copying Bash's signal termination messages复制 Bash 的信号终止消息
【发布时间】:2018-10-31 06:47:40
【问题描述】:

现在我正在制作一个程序,该程序应该模仿 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 ");
      }

      ...
}

这似乎是在尝试使用蛮力。

【问题讨论】:

标签: c shell signals


【解决方案1】:

如果您只需要原始描述,请使用@ZanLynx 的解决方案。

否则,通常和/或如果您出于某种原因需要调整消息:替换if/else if 链或switch 的常用方法是创建一个索引对应于条件的表,即:

const char * messages[] = {
    ...
    "Bus error",
    "Floating point exception",
    "Segmentation fault",
    ...
};

然后,将原始代码替换为:

fprintf(stderr, messages[signal]);

【讨论】:

  • 太棒了。这个答案实际上会给我更高的编码生活质量。我从来没有想过要做那样的事情。
  • 为了提高生活质量,您甚至可以使用const char *messages[] = {...}
  • @Lazarus:用数据结构替换代码?是的,学习是一件好事。 strsignal 在 C 库中做到了这一点:手册页提到它使用了一个名为 sys_siglist 的数组。但是你应该使用这个函数。
  • @wildplasser:确实!
【解决方案2】:

尝试来自string.h 标头的strsignal 或来自signal.hpsignal。阅读他们的手册页以获取文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2011-09-11
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多