信號集是將多個信號放在集合中進行集中的處理。
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),退出