#include #include #include #include #include #include "util.h" #define LEN(x) (sizeof(x)/sizeof((x)[0])) struct { const char *name; int sig; } sigs[] = { #define SIG(n) { #n, n } SIG(SIGHUP), SIG(SIGINT), SIG(SIGQUIT), SIG(SIGTRAP), SIG(SIGABRT), SIG(SIGKILL), SIG(SIGUSR1), SIG(SIGSEGV), SIG(SIGUSR2), SIG(SIGPIPE), SIG(SIGALRM), SIG(SIGTERM), SIG(SIGCHLD), SIG(SIGCONT), SIG(SIGSTOP), SIG(SIGTSTP), SIG(SIGTTIN), SIG(SIGTTOU), SIG(SIGWINCH) #undef SIG }; int num(const char *s) { char *end; int n = strtol(s, &end, 0); if(*end != '\0') eprintf("%s: not a number\n", s); return n; } int parse_sig(const char *s) { int i; if('0' <= *s && *s <= '9') return num(s); if(strncmp(s, "SIG", 3)) for(i = 0; i < LEN(sigs); i++) sigs[i].name += 3; for(i = 0; i < LEN(sigs); i++) if(!strcmp(sigs[i].name, s)) return sigs[i].sig; eprintf("%s: invalid signal\n", s); /* unreachable */ return -1; } int main(int argc, char *argv[]) { int sig = SIGTERM; int i; if(argc == 1){ usage: eprintf("usage: %s [-s signal] [pid...]\n", argv[0]); } i = 1; if(argv[i][0] == '-'){ if(!strcmp(argv[i], "-s")) { if(++i == argc) goto usage; sig = parse_sig(argv[i]); }else{ sig = parse_sig(argv[i] + 1); } i++; } if(i == argc) eprintf("%s: not enough arguments\n", argv[0]); for(; i < argc; i++) { int pid = num(argv[i]); if(kill(pid, sig) == -1) eprintf("kill %d:", pid); } return 0; }