zoukankan      html  css  js  c++  java
  • 信号集

     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 }

     输出结果:

  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/sunbines/p/10257438.html
Copyright © 2011-2022 走看看