信号集

 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 }

 输出结果:

原文地址:https://www.cnblogs.com/sunbines/p/10257438.html