可靠信号:(34-64)如果多个进程同时给一个进程发信号,会排队,依次从大到小依次响应。(没有默认触发机制)
不可靠信号(1-31)会丢失
验证代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> #include <signal.h> void Signal_Task1(int num) //输出不可靠信号 { printf("%d\n", num); } void Signal_Task2(int num) //输出可靠信号 { printf("%d\n", num); if (num == 34) { printf("------------------可靠信号------------\n"); } } int main() { sigset_t sig_set; //清空信号集 int sigemptyset_ret = sigemptyset(&sig_set); if (sigemptyset_ret == -1) { perror("sigemptyset"); exit(-1); } else { printf("清空信号集成功!\n"); } //将不可靠信号添加到信号集中 for (int i = 1; i <= 31; i++) { if (i == 9 || i == 19) continue; signal(i, Signal_Task1); sigaddset(&sig_set, i); //设置信号集堵塞 sigprocmask(SIG_BLOCK, &sig_set, NULL); raise(i); //自己调用自己 } //将可靠信号添加到信号集中 for (int i = 34; i <= 64; i++) { signal(i, Signal_Task2); sigaddset(&sig_set, i); //设置信号集堵塞 sigprocmask(SIG_BLOCK, &sig_set, NULL); raise(i); } //信号集解除阻塞 int unsigprocmask_ret = sigprocmask(SIG_UNBLOCK, &sig_set, NULL); if (unsigprocmask_ret == -1) { perror("sigprocmask"); exit(-1); } else { printf("解除信号堵塞成功\n"); } while (1) { sleep(1); } return 0; }