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 }

     输出结果:

  • 相关阅读:
    如何使用pgpool failover_stream.sh自己控制选择指定的master节点
    使用pgpool管理数据库集群故障的问题
    pgpool中定义的数据库节点及pgpool支持的复制模式
    pgpool中的配置参数的定义
    pgpool-II在故障切换过程中是如何选举新主节点的
    nginx的proxy_pass路径转发规则浅析(末尾/问题)
    elasticsearch 安装配置详解
    查看ElasticSearch服务状态和结果的URL
    Elastic数据迁移方法及注意事项
    Kafka安装及部署
  • 原文地址:https://www.cnblogs.com/sunbines/p/10257438.html
Copyright © 2011-2022 走看看