zoukankan      html  css  js  c++  java
  • 调用信号处理程序被捕捉的信号自动地加到进程的当前信号屏蔽字中signal() sigpending()

    //当调用一个信号处理程序时,被捕捉的信号自动地加到进程的当前信号屏蔽字中,阻止后来产生的这种信号中断改信号处理程序。
    //当从信号处理程序返回时,自动恢复原来的屏蔽字
    
    #include <stdio.h>                                                                                                         
    #include <signal.h>                                                                                                        
    #include <unistd.h>                                                                                                        
                                                                                                                               
    sigset_t set;                                                                                                              
                                                                                                                               
    void print(int signo)                                                                                                      
    {                                                                                                                          
            printf("handle SIGINT in print()!!!\n");                                                                           
    }                                                                                                                          
                                                                                                                               
    void catch(int signo)                                                                                                      
    {                                                                                                                          
            printf("\nin catch()...\n");                                                                                       
            signal(SIGINT, print);                                                                                             
                    sleep(5);                                                                                                  
            sigpending(&set);                                                                                                  
            if(sigismember(&set, SIGINT))                                                                                      
                    printf("block SIGINT!!!\n");                                                                               
            printf("out catch()...\n");                                                                                        
    }                                                                                                                          
                                                                                                                               
    int main()                                                                                                                 
    {                                                                                                                          
            signal(SIGINT, catch);                                                                                             
            while(1)                                                                                                           
            {                                                                                                                  
                    printf("in main()...\n");                                                                                  
                    sleep(1);                                                                                                  
            }                                                                                                                  
    }  
    /*
    coolulu@ubuntu:~/code/syscall$ ./signal1
    in main()...
    in main()...
    ^C
    in catch()...
    ^C^C^Cblock SIGINT!!!
    out catch()...
    handle SIGINT in print()!!!         <-如apue所说,解除了该信号的阻塞后,只会向进程传送一次该信号
    in main()...
    in main()...
    in main()...
    ^Chandle SIGINT in print()!!!
    in main()...
    ^Chandle SIGINT in print()!!!
    in main()...
    ^Chandle SIGINT in print()!!!
    in main()...
    ^\Quit
    coolulu@ubuntu:~/code/syscall$  
    */
    //这样说明了在 信号处理函数catch中^C被block,  
    //在信号处理函数catch中的 signal(SIGINT, print)永远收不到^C
    


  • 相关阅读:
    PostgreSQL主从流复制部署
    MySQL集群主从复制搭建
    zabbix修改支持中文主机名
    BGP总结(三)
    BGP总结(二)
    BGP总结(一)
    VXLAN配置实例(华为)
    VXLAN理论解析
    飞塔创建IPSec
    关于SANGFOR AC记录上网记录
  • 原文地址:https://www.cnblogs.com/coolulu/p/4084910.html
Copyright © 2011-2022 走看看