sigprocmask.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include <pthread.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. void* thread_func(void* arg)
  7. {
  8. exit(113);
  9. return NULL;
  10. }
  11. int main(int argc, char* argv[])
  12. {
  13. sigset_t newmask;
  14. sigset_t oldmask;
  15. sigemptyset(&newmask);
  16. sigemptyset(&oldmask);
  17. sigaddset(&newmask, SIGKILL);
  18. sigaddset(&newmask, SIGSTOP);
  19. int ret = sigprocmask(SIG_SETMASK, &newmask, NULL);
  20. if (ret < 0) {
  21. perror("sigprocmask failed");
  22. return -1;
  23. }
  24. ret = sigprocmask(SIG_SETMASK, NULL, &oldmask);
  25. if (ret < 0) {
  26. perror("sigprocmask failed");
  27. return -1;
  28. }
  29. if (sigismember(&oldmask, SIGKILL) || sigismember(&oldmask, SIGSTOP)) {
  30. printf("SIGKILL or SIGSTOP should be ignored, but not.\n");
  31. return -1;
  32. }
  33. pthread_t thread;
  34. ret = pthread_create(&thread, NULL, thread_func, NULL);
  35. if (ret < 0) {
  36. perror("pthread_create failed");
  37. return -1;
  38. }
  39. while(1)
  40. sleep(1);
  41. return -1;
  42. }