一、信号集
我们需要有一个能表示多个信号——信号集( signal set)的数据类型。将在 sigprocmask这样的函数中使用这种数据类型,以告诉内核不允许发生该信号集中的信号。如前所述,信号种类数目可能超过一个整型量所包含的位数,所以一般而言,不能用整型量中的一位代表一种信号。POSIX.1定义数据类型sigset _ t以包含一个信号集,并且定义了下列五个处理信号集的函数。
int sigemptyset(sigset_t *set) ;
int sigfillset(sigset_t *set) ;
int sigaddset(sigset_t *set, int signo) ;
int sigdelset(sigset_t *set, int signo) ;
int sigismember(const sigset_t *set, int signo);
函数sigemptyset初始化由set指向的信号集,使排除其中所有信号。函数 sigfillset初始化由set指向的信号集,使其包括所有信号。所有应用程序在使用信号集前,要对该信号集调用sigemptyset或sigfillset一次。这是因为C编译程序将不赋初值的外部和静态度量都初始化为 0,而这是否与给定系统上信号集的实现相对应并不清楚。
一旦已经初始化了一个信号集,以后就可在该信号集中增、删特定的信号。函数 sigaddset将一个信号添加到现存集中, sigdelset则从信号集中删除一个信号。对所有以信号集作为参数的函数,都向其传送信号集地址。
二、代码实例
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
//创建一个信号集
sigset_t set;
//清空信号集的内容
sigemptyset(&set);
//判断 SIGINT是否在信号集 set里
int ret = sigismember(&set,SIGINT);
if(ret==0)
{
printf("SIGINT 不阻塞\n");
}else if(ret==1)
{
printf("SIGINT 阻塞\n");
}
else{
perror("sigismember");
exit(0);
}
//添加几个信号到信号集中
sigaddset(&set,SIGINT);
sigaddset(&set,SIGQUIT);
//判断 SIGINT是否在信号集 set里
ret = sigismember(&set,SIGINT);
if(ret==0)
{
printf("SIGINT 不阻塞\n");
}else if(ret==1)
{
printf("SIGINT 阻塞\n");
}
else{
perror("sigismember");
exit(0);
}
//判断 SIGQUIT是否在信号集 set里
ret = sigismember(&set,SIGQUIT);
if(ret==0)
{
printf("SIGQUIT 不阻塞\n");
}else if(ret==1)
{
printf("SIGQUIT 阻塞\n");
}
else{
perror("sigismember");
exit(0);
}
//从信号集中删除信号
sigdelset(&set,SIGQUIT);
//判断 SIGQUIT是否在信号集 set里
ret = sigismember(&set,SIGQUIT);
if(ret==0)
{
printf("SIGQUIT 不阻塞\n");
}else if(ret==1)
{
printf("SIGQUIT 阻塞\n");
}
else{
perror("sigismember");
exit(0);
}
return 0;
}
总结
今天主要给大家介绍了处理信号集的函数及其使用。