1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <errno.h> 4 5 #include <sys/types.h> 6 #include <signal.h> 7 8 static struct { 9 unsigned int number; 10 char *name; 11 } signals[] = { 12 #define _SIG(name) {SIG##name, #name} 13 /* Single Unix Specification signals */ 14 _SIG(ABRT), 15 _SIG(ALRM), 16 _SIG(FPE), 17 _SIG(HUP), 18 _SIG(ILL), 19 _SIG(INT), 20 _SIG(KILL), 21 _SIG(PIPE), 22 _SIG(QUIT), 23 _SIG(SEGV), 24 _SIG(TERM), 25 _SIG(USR1), 26 _SIG(USR2), 27 _SIG(CHLD), 28 _SIG(CONT), 29 _SIG(STOP), 30 _SIG(TSTP), 31 _SIG(TTIN), 32 _SIG(TTOU), 33 _SIG(BUS), 34 _SIG(POLL), 35 _SIG(PROF), 36 _SIG(SYS), 37 _SIG(TRAP), 38 _SIG(URG), 39 _SIG(VTALRM), 40 _SIG(XCPU), 41 _SIG(XFSZ), 42 /* non-SUS signals */ 43 _SIG(IO), 44 _SIG(PWR), 45 _SIG(STKFLT), 46 _SIG(WINCH), 47 #undef _SIG 48 }; 49 50 /* To indicate a matching signal was not found */ 51 static const unsigned int SENTINEL = (unsigned int) -1; 52 53 void list_signals() 54 { 55 unsigned int sorted_signals[_NSIG]; 56 unsigned int i; 57 unsigned int num; 58 59 memset(sorted_signals, SENTINEL, sizeof(sorted_signals)); 60 61 // Sort the signals 62 for (i = 0; i < sizeof(signals)/sizeof(signals[0]); i++) { 63 sorted_signals[signals[i].number] = i; 64 } 65 66 num = 0; 67 for (i = 1; i < _NSIG; i++) { 68 unsigned int index = sorted_signals[i]; 69 if (index == SENTINEL) { 70 continue; 71 } 72 73 fprintf(stderr, "%2d) SIG%-9s ", i, signals[index].name); 74 75 if ((num++ % 4) == 3) { 76 fprintf(stderr, "\n"); 77 } 78 } 79 80 if ((num % 4) == 3) { 81 fprintf(stderr, "\n"); 82 } 83 } 84 85 unsigned int name_to_signal(const char* name) 86 { 87 unsigned int i; 88 89 for (i = 1; i < sizeof(signals) / sizeof(signals[0]); i++) { 90 if (!strcasecmp(name, signals[i].name)) { 91 return signals[i].number; 92 } 93 } 94 95 return SENTINEL; 96 } 97 98 int kill_main(int argc, char **argv) 99 { 100 unsigned int sig = SIGTERM; 101 int result = 0; 102 103 argc--; 104 argv++; 105 106 if (argc >= 1 && argv[0][0] == '-') { 107 char *endptr; 108 size_t arg_len = strlen(argv[0]); 109 if (arg_len < 2) { 110 fprintf(stderr, "invalid argument: -\n"); 111 return -1; 112 } 113 114 char* arg = argv[0] + 1; 115 if (arg_len == 2 && *arg == 'l') { 116 list_signals(); 117 return 0; 118 } 119 120 sig = strtol(arg, &endptr, 10); 121 if (*endptr != '\0') { 122 sig = name_to_signal(arg); 123 if (sig == SENTINEL) { 124 fprintf(stderr, "invalid signal name: %s\n", arg); 125 return -1; 126 } 127 } 128 129 argc--; 130 argv++; 131 } 132 133 while(argc > 0){ 134 int pid = atoi(argv[0]); 135 int err = kill(pid, sig); 136 if (err < 0) { 137 result = err; 138 fprintf(stderr, "could not kill pid %d: %s\n", pid, strerror(errno)); 139 } 140 141 argc--; 142 argv++; 143 } 144 145 return result; 146 } 147