test_sigprocmask.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #define TEST_ASSERT(left, right, success_msg, fail_msg) \
  6. do { \
  7. if ((left) == (right)) { \
  8. printf("[PASS] %s\n", success_msg); \
  9. } else { \
  10. printf("[FAIL] %s: Expected 0x%lx, but got 0x%lx\n", fail_msg, \
  11. (unsigned long)(right), (unsigned long)(left)); \
  12. } \
  13. } while (0)
  14. static int signal_received = 0;
  15. void signal_handler(int signo) {
  16. if (signo == SIGINT) {
  17. printf("\nReceived SIGINT (Ctrl+C)\n");
  18. signal_received = 1;
  19. }
  20. }
  21. void print_signal_mask(const char *msg, const sigset_t *mask) {
  22. printf("%s: ", msg);
  23. for (int signo = 1; signo < NSIG; ++signo) {
  24. if (sigismember(mask, signo)) {
  25. printf("%d ", signo);
  26. }
  27. }
  28. printf("\n");
  29. }
  30. // 获取当前屏蔽字的函数
  31. unsigned long get_signal_mask() {
  32. sigset_t sigset;
  33. if (sigprocmask(SIG_BLOCK, NULL, &sigset) == -1) {
  34. perror("sigprocmask");
  35. return -1; // 返回错误标记
  36. }
  37. // 将信号集编码为位掩码
  38. unsigned long mask = 0;
  39. for (int i = 1; i < NSIG; i++) {
  40. if (sigismember(&sigset, i)) {
  41. mask |= 1UL << (i - 1);
  42. }
  43. }
  44. return mask;
  45. }
  46. int main() {
  47. sigset_t new_mask, old_mask;
  48. sigemptyset(&old_mask);
  49. // 注册 SIGINT 的信号处理函数
  50. if (signal(SIGINT, signal_handler) == SIG_ERR) {
  51. perror("signal");
  52. exit(EXIT_FAILURE);
  53. }
  54. printf("Signal handler for SIGINT is registered.\n");
  55. signal_received = 0;
  56. kill(getpid(), SIGINT);
  57. sleep(5);
  58. TEST_ASSERT(signal_received, 1, "SIGINT was received",
  59. "SIGINT was not received");
  60. signal_received = 0;
  61. // 初始化新的信号集,并将 SIGINT 添加到其中
  62. sigemptyset(&new_mask);
  63. sigaddset(&new_mask, SIGINT);
  64. // 打印 new_mask 的值
  65. print_signal_mask("new_mask", &new_mask);
  66. // 屏蔽 SIGINT
  67. if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) < 0) {
  68. perror("sigprocmask - SIG_BLOCK");
  69. exit(EXIT_FAILURE);
  70. }
  71. // 打印 old_mask 的值
  72. print_signal_mask("old_mask", &old_mask);
  73. // 检查 SIGINT 是否被屏蔽
  74. unsigned long actual_mask = get_signal_mask();
  75. unsigned long expected_mask = (1UL << (SIGINT - 1));
  76. TEST_ASSERT(actual_mask, expected_mask, "Signal mask is as expected",
  77. "Signal mask mismatch");
  78. printf("SIGINT is now blocked.\n");
  79. signal_received = 0;
  80. // 向当前进程发送 SIGINT
  81. kill(getpid(), SIGINT);
  82. // 等待 5 秒,以便测试 SIGINT 是否被屏蔽
  83. sleep(5);
  84. TEST_ASSERT(signal_received, 0, "SIGINT was blocked",
  85. "SIGINT was not blocked");
  86. signal_received = 0;
  87. // 恢复原来的信号屏蔽字
  88. if (sigprocmask(SIG_SETMASK, &old_mask, &old_mask) < 0) {
  89. perror("sigprocmask - SIG_SETMASK");
  90. exit(EXIT_FAILURE);
  91. }
  92. print_signal_mask("old_mask returned", &old_mask);
  93. // 检查 SIGINT 是否被解除屏蔽
  94. actual_mask = get_signal_mask();
  95. expected_mask = 0;
  96. TEST_ASSERT(actual_mask, expected_mask, "Signal mask is as expected",
  97. "Signal mask mismatch");
  98. printf("SIGINT is now unblocked.\n");
  99. signal_received = 0;
  100. kill(getpid(), SIGINT);
  101. // 等待 5 秒,以便测试 SIGINT 是否解除屏蔽
  102. sleep(5);
  103. TEST_ASSERT(signal_received, 1, "SIGINT was received",
  104. "SIGINT was not received");
  105. printf("Exiting program.\n");
  106. return 0;
  107. }