Linux 如何实现信号屏蔽

所需信号集操作函数

#include<signal.h>
int sigemptyset(sigset_t *set);//初始化set所指向的信号集,使其所有信号对应bit清零
int sigfillset(sigset_t *set);//初始化set所指向的信号集,使其所有的对应bit置位
int sigaddset(sigset_t *set,int signo);//在该信号集中添加某种有效信号
int sigdelset(sigset_t *set,int signo);//在该信号集中删除某种有效信号
int sigismember(const sigset_t *set,int signo);//如果信号集里已有该信号则返回1,否则返回0
int sigprocmask(int how, const sigset_t * set, sigset_t * oldset);
    一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。sigprocmask()可以用来检测或改变目前的信号屏蔽字,其操作依参数how来决定,如果参数oldset不是NULL指针,那么目前的信号屏蔽字会由此指针返回。如果set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。
参数how的取值不同,带来的操作行为也不同,该参数可选值如下:
1.SIG_BLOCK: 该值代表的功能是将newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。
2.SIG_UNBLOCK:将参数newset所指向的信号集中的信号从当前的信号掩码中移除。
3.SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。

注意事项:sigprocmask()函数只为单线程的进程定义的,在多线程中要使用pthread_sigmask变量,在使用之前需要声明和初始化。

int sigpending(sigset_t *set)
    读取当前进程的未决信号集,通过set参数传输。调用成功返回0,出错则返回-1.

简单实现信号屏蔽

#include<stdio.h>
#include<signal.h>

void printsig(sigset_t* set)
{
    int i = 0;
    for(i = 0;i<32;i++)
    {   
        if(sigismember(set,i))//判定指定信号是否在目标集合中
                              //此处判断的信号为2号信号
                              //所以第3个数会被置1
        {   
            printf("1");
        }   
        else
        {   
            printf("0");
        }   
    }   
    printf("\n");
}

int main()
{    
    sigset_t t,p;
    sigemptyset(&t);//定义信号集对象,并清空初始化
    sigaddset(&t,SIGINT);//SIGINT即为ctrl+c,是2号进程
    sigprocmask(SIG_BLOCK,&t,NULL);//设置阻塞信号集,阻塞SIGINT信号
    while(1)
    {   
        sigpending(&p);//获取未决信号
        printsig(&p);
        sleep(1);
    }   
    return 0;
}

键入ctrl+c (SIGINT),该信号被阻塞,所以一直处于未决状态,不被处理。

猜你喜欢

转载自blog.csdn.net/ihaha233/article/details/80292870