sigprocmask.c 1.0 KB

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