信号处理的方法主要有两种,一种是使用signal()函数,另一种是使用信号集函数组。
实例
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
/*自定义的信号处理函数*/
void my_func(int sign_no)
{
if(sign_no == SIGINT)
{
printf("\ni have get SIGINT\n");
}
if(sign_no == SIGQUIT)
{
printf("\ni have get SIGQUIT\n");
}
}
int main()
{
sigset_t set,pendset;
struct sigaction action1,action2;
/*初始化信号集为空*/
if(sigemptyset(&set) <0)
{
printf("sigemptyset error\n");
exit(1);
}
/*将相应的信号加入信号集*/
if(sigaddset(&set,SIGINT) < 0)
{
printf("sigaddset error\n");
exit(1);
}
if(sigaddset(&set,SIGQUIT) < 0)
{
printf("sigaddset error\n");
exit(1);
}
/*sigismember()查询指定信号是否在信号集中*/
if(sigismember(&set,SIGINT))
{
sigemptyset(&action1.sa_mask);
action1.sa_handler=my_func; //指定信号处理函数
action1.sa_flags=0; //sa_flags中包含了许多标志位,是对信号进行处理的各个选择项。
/***********************
函数原型:int sigaction(int signum,
const struct sigaction *act ,
struct sigaction *oldact);
函数参数:signum 信号代码
act 指向sigaction的一个实例的指针,指定对特定信号的处理
oldact 保存原来对相应信号的处理
***************************/
sigaction(SIGINT,&action1,NULL);
}
if(sigismember(&set,SIGQUIT))
{
sigemptyset(&action2.sa_mask);
action2.sa_handler=my_func; //采用默认的处理方式
action2.sa_flags=0; //sa_flags中包含了许多标志位,是对信号进行处理的各个选择项。
/***********************
函数原型:int sigaction(int signum,
const struct sigaction *act ,
struct sigaction *oldact);
函数参数:signum 信号代码
act 指向sigaction的一个实例的指针,指定对特定信号的处理
oldact 保存原来对相应信号的处理
***************************/
sigaction(SIGQUIT,&action2,NULL);
}
/*设置信号集屏蔽字,此时set中的信号不会被传递给进程,暂时进入等待处理状态*/
if(sigprocmask(SIG_BLOCK,&set,NULL)<0)
{
printf("sigprocmask error\n");
exit(1);
}
else
{
/*信号被设置为阻塞状态*/
printf("signal set was blocked,Press any key:\n");
getchar();
}
/*在信号屏蔽字中删除set中的信号*/
if(sigprocmask(SIG_UNBLOCK,&set,NULL) < 0)
{
printf("sigprocmask error\n");
exit(1);
}
else
{
printf("signal set is unblock state\n");
}
while(1);
return 0;
}
运行结果