kill.c 912 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "lib.h"
  2. #include <fcntl.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <errno.h>
  8. static int
  9. note(int pid, char *msg, char *fmt)
  10. {
  11. int f;
  12. char pname[50];
  13. sprintf(pname, fmt, pid);
  14. f = open(pname, O_WRONLY);
  15. if(f < 0){
  16. errno = ESRCH;
  17. return -1;
  18. }
  19. if(msg != 0 && write(f, msg, strlen(msg)) < 0){
  20. close(f);
  21. errno = EPERM;
  22. return -1;
  23. }
  24. close(f);
  25. return 0;
  26. }
  27. int
  28. kill(pid_t pid, int sig)
  29. {
  30. char *msg;
  31. int sid, r, mpid;
  32. if(sig == 0)
  33. msg = 0;
  34. else {
  35. msg = _sigstring(sig);
  36. if(msg == 0) {
  37. errno = EINVAL;
  38. return -1;
  39. }
  40. }
  41. if(pid < 0) {
  42. sid = getpgrp();
  43. mpid = getpid();
  44. if(setpgid(mpid, -pid) == 0) {
  45. r = note(mpid, msg, "/proc/%d/notepg");
  46. setpgid(mpid, sid);
  47. } else {
  48. r = -1;
  49. }
  50. } else if(pid == 0)
  51. r = note(getpid(), msg, "/proc/%d/notepg");
  52. else
  53. r = note(pid, msg, "/proc/%d/note");
  54. return r;
  55. }