unix信号有1~63个,其中1~31是传统信号,是不可靠(非实时)信号,32~63是可靠(实时)信号,不可靠和可靠信号的区别是不可靠信号多次发送会造成排队,N个相同信号,排队后会变成1个信号。可靠信号N次发送经过排队后,处理时仍是N个信号。
例如N个SIGINT(2)+M个SIGQUIT(3),经过排队后,变成了1个SIGINT+1个SIGQUIT信号。
N个SIGRTMIN(34) 经过排队后还是N个SIGRTMIN信号。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
void signal_handler(int signo);
int main(void) {
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGRTMIN);
sigaddset(&set, SIGQUIT);
sigprocmask(SIG_BLOCK, &set, NULL);
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = signal_handler;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGRTMIN, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
int count = 0;
while (1) {
if (count >= 100) {
break;
}
printf("sleep...%d\n", count);
sleep(1);
if (count > 0 && count % 20 == 0) {
printf("挂起等待信号...\n");
sigemptyset(&set);
sigsuspend(&set);
}
count++;
}
}
void signal_handler (int signo) {
if (signo == SIGINT) {
printf("catch signal SIGINT:%d\n", signo);
} else if (signo == SIGRTMIN) {
printf("catch signal SIGRTMIN:%d\n", signo);
} else if (signo == SIGQUIT) {
printf("catch siganl SIGQUIT:%d, exit...\n", signo);
//exit(0);
} else {
printf("catch signal:%d\n", signo);
}
}