头文件:signal.h
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set,int signum);
int sigdelset(sigset_t *set,int signum);
判断信号量是否属于某一个信号集,属于返回1否则返回0
int sigismember(const sigset_t *set,int signum);
信号集操作
int sigprocmask(int how,const sigset_t *set,sigset_t *oset);
进程的信号掩码(signal mask)是指传送给单签信号时被阻塞的信号的集合。进程可以通过上面函数来检测或者改变信号掩码。
1.如果oset是一个非空指针,那么oset将返回进程的当前信号掩码。
2.如果set是一个 非空指针,那么how参数决定当前进程的信号掩码的变化情况
SIG_BLOCK:新的信号掩码是当前信号掩码和set所指向的信号集的和,即set所指向的信号集包含了我们要增加的被阻塞的信号。
SIG_UNBLOCK:新的信号掩码是当前信号掩码和set所指向的信号集的差,即set所指向的信号集包含了我们要增加的不被阻塞的信号。
SIG_SETMASK:进程的新信号掩码为set所指的信号集。
例子1:sigprocmask操作
#include <signal.h>
void pr_mask(const char *str)
{
sigset_t sigset;
if(sigprocmask(0,NULL,&sigset) < 0)
{
printf("sigprocmask error!\n");
exit(0);
}
printf("%s",str);
if(sigismember(&sigset,SIGINT))
{
printf("SIGINT\n");
}
if(sigismember(&sigset,SIGQUIT))
{
printf("SIGQUIT\n");
}
if(sigismember(&sigset,SIGUSR1))
{
printf("SIGUSR1\n");
}
if(sigismember(&sigset,SIGALRM))
{
printf("SIGALRM");
}
}
2.sigpending函数
sigpending 函数返回在送往进程的时候被阻塞挂起的信号的集合。
int sigpending(sigset_t *set);
#include <signal.h>
#include <stdio.h>
static void sig_quit(int);
int main()
{
sigset_t newmask,oldmask,pendmask;
if(signal(SIGQUIT,&sig_quit) == -1)
{
printf("couldn't register signal hanlder for SIGQUIT!\n");
exit(1);
}
sigemptyset(&newmask);
sigaddset(&newmask,SIGQUIT);
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
{
printf("SIG_BLOCK error.\n");
exit(2);
}
sleep(5);
if(sigpending(&pendmask) < 0)
{
printf("sigpending error.\n");
exit(3);
}
if(sigismember(&pendmask,SIGQUIT))
{
printf("SIGQUIT pending!\n");
}
if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
{
printf("SIG_SETMASK error.\n");
exit(4);
}
printf("SIGQUIT unblocked.\n");
sleep(5);
exit(0);
}
static void sig_quit(int signum)
{
printf("catch SIGQUIT.\n");
if(signal(SIGQUIT,SIG_DFL)==-1)
printf("couldn't reset SIGQUIT!\n");
return;
}