• 信号屏蔽字(收集)


    1.一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集

    sigemptyset 函数初始化信号集合set,将set 设置为空.

    sigfillset 也初始化信号集合,只是将信号集合设置为所有信号的集合.

    sigaddset 将信号signo 加入到信号集合之中,sigdelset 将信号从信号集合中删除.

    sigdelset用来将参数signum代表的信号从参数set信号集里删除

    sigismember 查询信号是否在信号集合之中.s

    sigprocmask 是最为关键的一个函数.在使用之前要先设置好信号集合set.这个函数的作用是将指定的信号集合set 加入到进程的信号阻塞集合之中去,如果提供了oset 那么当前的进程信号阻塞集合将会保存在oset 里面.参数how 决定函数的操作方式:
    SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中.
    SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合.
    SIG_SETMASK:将当前的信号集合设置为信号阻塞集合.

    2.Test code from net.

    #include <stdio.h>  
    #include <signal.h>  
    
    void checkset();  
      
    int main(int argc, char* argv[])  
    {  
         sigset_t blockset;  
         sigemptyset(&blockset);  
         sigaddset(&blockset,SIGINT);  
         sigaddset(&blockset,SIGTSTP);  
        printf("first check 
    ");
         checkset();  
    sigprocmask(SIG_SETMASK,
    &blockset,NULL);    printf("second check "); checkset(); sigaddset(&blockset,SIGTERM); sigprocmask(SIG_BLOCK,&blockset,NULL);    printf("third check "); checkset(); sigdelset(&blockset,SIGTERM); sigprocmask(SIG_UNBLOCK,&blockset,NULL);    printf("forth check "); checkset(); return 0; } void checkset() { sigset_t set; printf("checksetstart: "); if(sigprocmask(0,NULL,&set)<0) { printf("checksetsigprocmask error!! "); exit(0); } if(sigismember(&set,SIGINT)) printf("sigint "); if(sigismember(&set,SIGTSTP)) printf("sigtstp "); if(sigismember(&set,SIGTERM)) printf("sigterm "); printf("checksetend "); }

    测试输出

    [root@localhost test]# ./signal
    first check 
    checksetstart:
    checksetend
    second check 
    checksetstart:
    sigint
    sigtstp
    checksetend
    third check 
    checksetstart:
    sigint
    sigtstp
    sigterm
    checksetend
    forth check 
    checksetstart:
    sigterm
    checksetend
    

    上面sigprocmask(SIG_UNBLOCK,
    &blockset,NULL); 时,当前进程的信号屏蔽字{SIGINT,SIGTSTP,SIGTERM}
    blockset 里存储了信号屏蔽字{SIGINT,SIGTSTP}。 调用之后 当前进程的信号屏蔽字为{SIGTERM}。

      

     http://www.gnu.org/software/libc/manual/html_node/Signal-Sets.html#Signal-Sets

    http://www.gnu.org/software/libc/manual/html_node/Blocking-Signals.html#Blocking-Signals

  • 相关阅读:
    WCF bindings comparison z
    DevExpress打印功能 z
    使用Topshelf 5步创建Windows 服务 z
    Log4net中的RollingFileAppender z
    Log4Net在Windows服务中不能记录日志 z
    dev 注册方法 z
    async callback z
    多窗体之间方法调用 z
    [JS6] 通过用户事件事件执行脚本
    [JS5] 利用onload执行脚本
  • 原文地址:https://www.cnblogs.com/iclk/p/3683050.html
Copyright © 2020-2023  润新知