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.\n", set );

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

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

    kill( getpid(), SIGQUIT );
    sigpending( &pset );
    printf( "Pending set is %8.8ld.\n", 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

 

posted @ 2017-03-02 11:35  blcblc  阅读(487)  评论(0编辑  收藏  举报