信号集是将多个信号放在集合中进行集中的处理。
int sigemptyset(sigset_t *set);
将set集合置空
int sigfillset(sigset_t *set);
将所有信号加入set集合
int sigaddset(sigset_t *set,int signo);
将signo信号加入到set集合
int sigdelset(sigset_t *set,int signo);
从set集合中移除signo信号
int sigismember(const sigset_t *set,int signo); 判断signo信号是否存在于set集合中
举例说明
include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
//自定义信号处理函数
void my_func(int signum)
{
printf("catch Ctrl + c\n");
}
int main()
{
sigset_t set,pendset;
struct sigaction action1,action2;
//初始化信号集为空
if(sigemptyset(&set)<0)
perror("sigemptyset");
//将相应的信号加入信号集
if(sigaddset(&set,SIGQUIT)<0)
perror("sigaddset");
if(sigaddset(&set,SIGINT)<0)
perror("sigaddset");
//设置信号集阻塞
if(sigprocmask(SIG_BLOCK,&set,NULL)<0)
{
perror("sigprocmask");
}else
{
printf("blocked\n");
}
printf("please wait 10s to unlock\n");
sleep(10);
printf("unblock\n");
//设置解除信号集阻塞,注释下面代码后信号失效
if(sigprocmask(SIG_UNBLOCK,&set,NULL)<0)
perror("sigprocmask");
//测试SIGINT是否在信号掩码集set中
if(sigismember(&set,SIGINT)){
//对相应的信号进行屏蔽处理
sigemptyset(&action1.sa_mask);
action1.sa_handler=my_func;
sigaction(SIGINT,&action1,NULL);
}else if(sigismember(&set,SIGQUIT)){
sigemptyset(&action2.sa_mask);
action2.sa_handler = SIG_DFL;
sigaction(SIGQUIT,&action2,NULL);
}
for(;;)
pause();
return 0;
}
gcc sig.c -o sig
//////////////////////////////////////
#sig
#block
#please wait 10s to unlock
情况一,在10内操作
//此时,按多少次Crtl+\或Ctrl+c,在10s内都是无效的,但这先消息会被保存。10s后根据输入出现三种情况
1.只按了Ctrl+c,直接退出
2.只按了Ctrl+\,打印Quit(core dumped),退出
3.多次按了且同时有Ctrl+c和Ctrl+\,退出
情况二,在10后操作
1.Ctrl+c被捕获打印自定义语句,不退出
2.Ctrl+\,打印Quit(core dumped),退出