linux信号集

信号集是将多个信号放在集合中进行集中的处理。

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),退出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章