Bootstrap

linux 信号集

头文件: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;
}






;