zoukankan      html  css  js  c++  java
  • sigprocmask, sigpending, sigsuspend的用法

    sigset_t set

    sigemptyset(&set) :清空阻塞信号集合变量

    sigfillset(&set) :添加所有的信号到阻塞集合变量里

    sigaddset(&set,SIGINT):添加单一信号到阻塞信号集合变量

    sigdelset(&set,SIGINT):从阻塞信号集合变量中删除单一信号

    void handler(int sig)    //信号处理函数的实现

    {

       printf("SIGINT sig");

    }

    功能:返回在阻塞期间接收到阻塞信号的集合。

     {
            sigset_t set;             //定义阻塞信号集的变量
            sigemptyset(&set);        //清空变量set的阻塞信号
            sigaddset(&set,SIGINT);   //添加将要阻塞的信号"SIGINT"到阻塞信号集变量
            sigdelset(&set,SIGINT);   //从已有的阻塞信号集变量中删除阻塞信号"SIGINT"
            sigaddset(&set,SIGQUIT);  //添加将要阻塞的信号"SIGQUIT"到阻塞信号集变量
            sigprocmask(SIG_SETMASK,&set,NULL);// 将当前的阻塞信号集合变量set设置为该进程信号阻塞列表
            while(1);                 //
            return 0;
    }

    sigpending 函数:

    printf( "set is %8.8ld. ", set );

        sigpending( &pset );
        printf( "Pending set is %8.8ld. ", pset );

        kill( getpid(), SIGINT );
        sigpending( &pset );
        printf( "Pending set is %8.8ld. ", pset );

        kill( getpid(), SIGQUIT );
        sigpending( &pset );
        printf( "Pending set is %8.8ld. ", pset );

    sigsuspend函数(感觉场景不太普遍)

    功能:它有一套属于自己的屏蔽信号mask,能够选择性接收某些信号。在接收到可行信号(也即是没有被屏蔽的信号)之前,运行到它时,它会一直悬挂着,有点类似pause()函数。接受到可行信号后,它会退出悬挂并执行相应的信号函数。接收到的信号源:1.之前运行sigprocmask()函数中阻塞的信号;2.悬挂后接受到的信号。

    sigsuspend的整个原子操作过程为:
    (1) 设置新的mask阻塞当前进程;
    (2) 收到信号,恢复原先mask;
    (3) 调用该进程设置的信号处理函数;
    (4) 待信号处理函数返回后,sigsuspend返回。

    sleep也是用sigsuspend实现的。

    http://blog.csdn.net/elbort/article/details/7594772

    http://blog.csdn.net/todd911/article/details/17319591

  • 相关阅读:
    Eclipse EE 3.6 failed to create the java virtual machine 解决
    [收藏]家用三线插座(220V单相)正确接线方法
    Java设计模式 Design Pattern:包装模式 Decorator Pattern
    MIME 类型列表
    面试题参考
    循环队列的运用求K阶斐波那契序列
    加密技术仿射密码
    面试题集锦_1
    栈的运用(5)转换逆波兰式
    栈的运用(6)逆波兰式求值
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6489737.html
Copyright © 2011-2022 走看看