线程阻塞等待信号

在我的应用程序中,我尝试捕获SIGUSR1的特定信号,我写了下面的代码来执行此问题,其中应用程序将为“init_signal_catcher”创build一个线程。

问题是当我运行代码时,程序会永远睡眠,即使是SIGUSR1也不会响应任何信号。

那么你能告诉我下面的代码是什么问题吗?

注意:下面的代码可以直接运行,而不必创build一个线程,只需用main替​​换函数名init_signal_catcher即可。

#include <unistd.h> #include <signal.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <errno.h> #include <sys/mman.h> #include <string.h> /* Value of the last signal caught */ volatile sig_atomic_t sig_value; static void sig_handler(const int sig_number, siginfo_t *sig_info, void *context) { if (sig_number == SIGSEGV) { error_sys("Error at address 0x%lx", (long)sig_info->si_addr); exit(-1); } sig_value = sig_number; } int init_signal_catcher() { struct sigaction sig_action; /* Structure describing the action to be taken when asignal arrives. */ sigset_t oldmask; /* Signal mask before signal disposition change. */ sigset_t newmask; /* Signal mask after signal disposition change. */ sigset_t zeromask; /* Signal mask to unblock all signal while suspended. */ /* Define signal mask and install signal handlers */ memset(&sig_action, 0, sizeof(struct sigaction)); sig_action.sa_flags = SA_SIGINFO; sig_action.sa_sigaction = sig_handler; /* Examine and change a signal action. */ sigaction(SIGHUP, &sig_action, NULL); sigaction(SIGINT, &sig_action, NULL); sigaction(SIGTERM, &sig_action, NULL); sigaction(SIGSEGV, &sig_action, NULL); sigaction(SIGUSR1, &sig_action, NULL); /* Block SIGHUP, SIGINT, SIGTERM, SIGSEGV and SIGUSR1 signals. */ sigemptyset(&newmask); sigaddset(&newmask, SIGHUP); sigaddset(&newmask, SIGINT); sigaddset(&newmask, SIGTERM); sigaddset(&newmask, SIGSEGV); sigaddset(&newmask, SIGUSR1); /* Examine and change blocked signals. */ sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* Initialize the empty signal set. */ sigemptyset(&zeromask); sig_value = 0; while ((sig_value != SIGINT) && (sig_value != SIGTERM)) { sig_value = 0; /* * Go to sleep (unblocking all signals) until a signal is catched. * On return from sleep, the signals SIGHUP, SIGINT, SIGTERM and * SIGUSR1 are again blocked. */ printf("Suspending on %lu mask.", zeromask); // Wait for a signal. sigsuspend(&zeromask); switch(sig_value) { printf("Caught Signal %d", sig_value); case SIGUSR1: printf("Caught SIGUSR1"); break; } } return 0; }