zoukankan      html  css  js  c++  java
  • [Linux]关于sigprocmask函数的讨论

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #include <unistd.h>
     5 #include <signal.h>
     6 #include <assert.h>
     7 
     8 void printSignal()
     9 {
    10     sigset_t set;
    11     int ret = 0;
    12     sigemptyset(&set);
    13     ret = sigpending(&set);    
    14     int i = 1;
    15     for (i = 1; i < 65; i++)
    16     {
    17         if (0 == (ret = sigismember(&set, i)))
    18         {
    19             printf("0");
    20         }
    21         else if (1 == ret)
    22         {
    23             printf("1");
    24         }
    25     }
    26     puts("");
    27 }
    28 
    29 void my_sigaction (int num, siginfo_t *st, void *dat)
    30 {
    31     int ret = 0;
    32     if (SIGINT == num)
    33     {
    34         sigset_t set;
    35         sigemptyset(&set);
    36         ret = sigaddset(&set, SIGQUIT);
    37         assert(-1 != ret);
    38         ret = sigprocmask(SIG_UNBLOCK, &set, NULL);
    39         assert(-1 != ret);
    40         printf("my_sigaction
    ");
    41         printSignal();
    42         printf("func myhandler num = %d
    ", num);        
    43     }
    44     else
    45     {
    46         printf("signal is  no SIGQUIT
    ");
    47     }
    48 }
    49 
    50 
    51 
    52 int main(void)
    53 {
    54     int ret = 0;
    55     
    56     /* 阻塞信号  */
    57     sigset_t set;
    58     sigemptyset(&set);
    59     ret = sigaddset(&set, SIGQUIT);
    60     assert(-1 != ret);
    61     ret = sigprocmask(SIG_BLOCK, &set, NULL);
    62     assert(-1 != ret);
    63     printf("阻塞信号
    ");
    64     //printSignal();
    65     sigemptyset(&set);
    66     /* 
    67 sigpending 是从未决状态字中读取的, 但是未决信号并不能立即得到block的同步
    68 也就是说在block置1时pending并不能够立即的更新为1 
    69 */
    70     //sigpending(&set);
    71     
    72     /* 注册信号 */
    73     struct sigaction act;
    74     act.sa_sigaction = my_sigaction;
    75     ret = sigemptyset(&(act.sa_mask));
    76     assert(-1 != ret);
    77     ret = sigaction(SIGINT, &act, NULL);
    78     assert(-1 != ret);
    79     printf("注册信号
    ");
    80     printSignal();
    81     
    82     while (1)
    83     {
    84         printSignal();
    85         sleep(1);
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    TestPaste text
    WPF XML序列化保存数据 支持Datagrid 显示/编辑/添加/删除数据
    C# WPF xml序列化 反序列化
    C# show FTP Download/Upload progress
    BAT for 循环
    C# httpRequest Soap请求
    day6 os模块
    day6 random随机数模块
    day6 time和datetime模块
    day5 常用模块json和pickle
  • 原文地址:https://www.cnblogs.com/bangiao/p/6498270.html
Copyright © 2011-2022 走看看