text: #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  
  #include <sys/types.h>
  #include <signal.h>
  
  static struct {
      unsigned int number;
      char *name;
  } signals[] = {
  #define _SIG(name) {SIG##name, #name}
      /* Single Unix Specification signals */
      _SIG(ABRT),
      _SIG(ALRM),
      _SIG(FPE),
      _SIG(HUP),
      _SIG(ILL),
      _SIG(INT),
      _SIG(KILL),
      _SIG(PIPE),
      _SIG(QUIT),
      _SIG(SEGV),
      _SIG(TERM),
      _SIG(USR1),
      _SIG(USR2),
      _SIG(CHLD),
      _SIG(CONT),
      _SIG(STOP),
      _SIG(TSTP),
      _SIG(TTIN),
      _SIG(TTOU),
      _SIG(BUS),
      _SIG(POLL),
      _SIG(PROF),
      _SIG(SYS),
      _SIG(TRAP),
      _SIG(URG),
      _SIG(VTALRM),
      _SIG(XCPU),
      _SIG(XFSZ),
      /* non-SUS signals */
      _SIG(IO),
      _SIG(PWR),
      _SIG(STKFLT),
      _SIG(WINCH),
  #undef _SIG
  };
  
  /* To indicate a matching signal was not found */
  static const unsigned int SENTINEL = (unsigned int) -1;
  
  void list_signals()
  {
      unsigned int sorted_signals[_NSIG];
      unsigned int i;
      unsigned int num;
  
      memset(sorted_signals, SENTINEL, sizeof(sorted_signals));
  
      // Sort the signals
      for (i = 0; i < sizeof(signals)/sizeof(signals[0]); i++) {
          sorted_signals[signals[i].number] = i;
      }
  
      num = 0;
      for (i = 1; i < _NSIG; i++) {
          unsigned int index = sorted_signals[i];
          if (index == SENTINEL) {
              continue;
          }
  
          fprintf(stderr, "%2d) SIG%-9s ", i, signals[index].name);
  
          if ((num++ % 4) == 3) {
              fprintf(stderr, "\n");
          }
      }
  
      if ((num % 4) == 3) {
          fprintf(stderr, "\n");
      }
  }
  
  unsigned int name_to_signal(const char* name)
  {
      unsigned int i;
  
      for (i = 1; i < sizeof(signals) / sizeof(signals[0]); i++) {
          if (!strcasecmp(name, signals[i].name)) {
              return signals[i].number;
          }
      }
  
      return SENTINEL;
  }
  
  int kill_main(int argc, char **argv)
  {
      unsigned int sig = SIGTERM;
      int result = 0;
  
      argc--;
      argv++;
  
      if (argc >= 1 && argv[0][0] == '-') {
          char *endptr;
          size_t arg_len = strlen(argv[0]);
          if (arg_len < 2) {
              fprintf(stderr, "invalid argument: -\n");
              return -1;
          }
  
          char* arg = argv[0] + 1;
          if (arg_len == 2 && *arg == 'l') {
              list_signals();
              return 0;
          }
  
          sig = strtol(arg, &endptr, 10);
          if (*endptr != '\0') {
              sig = name_to_signal(arg);
              if (sig == SENTINEL) {
                  fprintf(stderr, "invalid signal name: %s\n", arg);
                  return -1;
              }
          }
  
          argc--;
          argv++;
      }
  
      while(argc > 0){
          int pid = atoi(argv[0]);
          int err = kill(pid, sig);
          if (err < 0) {
              result = err;
              fprintf(stderr, "could not kill pid %d: %s\n", pid, strerror(errno));
          }
  
          argc--;
          argv++;
      }
  
      return result;
  }
  