1. 信号集:
sigset_t set; //typedef unsigned long sigset_t int sigemptyset(sigset_t *set) // 将某个信号集清0 int sigfillset(sigset_t *set) // 将某个信号集置1 int sigaddsetset(sigset_t *set, int sino) // 将某个信号加入信号集 int sigdelset(sigset_t *set, int signo) // 将某个信号清出信号集
2. 函数sigprocmask
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
分析:
1. set:传入参数,是一个位图,set中哪个位置置为1,就表示当前进程屏蔽了哪个信号
2. oldset:传出参数,保存旧的信号屏蔽集
3. how参数取值
- SIG_BLOCK:当how设置为此值,set表示需要屏蔽的信号
- SIGB_UNBLOCK:当how设置为此值,set表示需要解除屏蔽的信号
- SIG_SETMASK:当how设置为此值,set表示用于替代原始屏蔽集的新屏蔽集,相当于mask = set,若调用sigprocmask解除了对当前信号若干个信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。
3. 函数sigpendin:读取当前信号的未决信号集
int sigpending(sigset_t *set); //set传出参数
1. 测试代码
1 #include <stdio.h> 2 #include <signal.h> 3 #include <unistd.h> 4 5 void printped(sigset_t *ped) 6 { 7 int i; 8 for (i = 1; i < 32; i++) 9 { 10 if (sigismember(ped, i) == 1) 11 putchar('1'); 12 else 13 putchar('0'); 14 } 15 printf(" "); 16 } 17 18 int main() 19 { 20 sigset_t myset, oldset, ped; 21 sigemptyset(&myset); 22 sigaddset(&myset, SIGQUIT); // Ctrl + / 23 sigaddset(&myset, SIGINT); // Ctrl + C 24 sigaddset(&myset, SIGTSTP); // Ctrl + Z 25 sigaddset(&myset, SIGSEGV); 26 sigaddset(&myset, SIGKILL); //无法被屏蔽 27 sigprocmask(SIG_BLOCK, &myset, &oldset); 28 while (1) 29 { 30 sigpending(&ped); 31 printped(&ped); 32 sleep(2); 33 } 34 return 0; 35 }
输出结果:
2. 测试代码:
1 #include <unistd.h> 2 #include <signal.h> 3 #include <string.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 7 void handler(int sig) 8 { 9 if (sig == SIGINT) 10 printf("recv a sig = %d ", sig); 11 else if (sig == SIGQUIT) 12 { 13 sigset_t uset; 14 sigemptyset(&uset); 15 sigaddset(&uset, SIGINT); 16 sigprocmask(SIG_UNBLOCK, &uset, NULL); 17 } 18 } 19 20 void printsigset(sigset_t *set) 21 { 22 int i; 23 for (i = 1; i < 32; ++i) 24 { 25 if (sigismember(set, i)) 26 putchar('1'); 27 else 28 putchar('0'); 29 } 30 printf(" "); 31 } 32 33 int main(int argc, char *argv[]) 34 { 35 sigset_t pset; 36 sigset_t bset; 37 sigemptyset(&bset); 38 sigaddset(&bset, SIGINT); 39 if (signal(SIGINT, handler) == SIG_ERR) 40 { 41 perror("signal error"); 42 exit(1); 43 } 44 if (signal(SIGQUIT, handler) == SIG_ERR) 45 { 46 perror("signal error"); 47 exit(1); 48 } 49 sigprocmask(SIG_BLOCK, &bset, NULL); 50 for (; ;) 51 { 52 sigpending(&pset); 53 printsigset(&pset); 54 sleep(1); 55 } 56 return 0; 57 }
输出结果: