sigprocmask.c 1.0 KB

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