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
    


  • 相关阅读:
    软件开发过程中应当遵守的原则
    企业架构是什么?
    软件工程的精髓
    PHP获取自然周列表,周开始结束日期,月开始结束时间方法类
    JS替换textarea里的回车换行
    PHP连接PGSQL
    PT与PX的区别
    JQuery 翻页小记
    PHP中替换textarea时的回车换行
    HTML5 CanvasOreilly.Canvas.Pocket.Reference (4)
  • 原文地址:https://www.cnblogs.com/coolulu/p/4084910.html
Copyright © 2011-2022 走看看