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

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