kill.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <stdlib.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <ctype.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #define NSIG SIGUSR2
  9. char *signm[NSIG+1] = { 0,
  10. "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", "SIGFPE", "SIGKILL", /* 1-7 */
  11. "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGUR1", "SIGUSR2", /* 8-13 */
  12. };
  13. main(int argc, char **argv)
  14. {
  15. int signo, pid, res;
  16. int errlev;
  17. errlev = 0;
  18. if (argc <= 1) {
  19. usage:
  20. fprintf(stderr, "usage: kill [ -sig ] pid ...\n");
  21. fprintf(stderr, "for a list of signals: kill -l\n");
  22. exit(2);
  23. }
  24. if (*argv[1] == '-') {
  25. if (argv[1][1] == 'l') {
  26. int i = 0;
  27. for (signo = 1; signo <= NSIG; signo++)
  28. if (signm[signo]) {
  29. printf("%s ", signm[signo]);
  30. if (++i%8 == 0)
  31. printf("\n");
  32. }
  33. if(i%8 !=0)
  34. printf("\n");
  35. exit(0);
  36. } else if (isdigit(argv[1][1])) {
  37. signo = atoi(argv[1]+1);
  38. if (signo < 0 || signo > NSIG) {
  39. fprintf(stderr, "kill: %s: number out of range\n",
  40. argv[1]);
  41. exit(1);
  42. }
  43. } else {
  44. char *name = argv[1]+1;
  45. for (signo = 1; signo <= NSIG; signo++)
  46. if (signm[signo] && (
  47. !strcmp(signm[signo], name)||
  48. !strcmp(signm[signo]+3, name)))
  49. goto foundsig;
  50. fprintf(stderr, "kill: %s: unknown signal; kill -l lists signals\n", name);
  51. exit(1);
  52. foundsig:
  53. ;
  54. }
  55. argc--;
  56. argv++;
  57. } else
  58. signo = SIGTERM;
  59. argv++;
  60. while (argc > 1) {
  61. if ((**argv<'0' || **argv>'9') && **argv!='-')
  62. goto usage;
  63. res = kill(pid = atoi(*argv), signo);
  64. if (res<0) {
  65. perror("kill");
  66. }
  67. argc--;
  68. argv++;
  69. }
  70. return(errlev);
  71. }