linux信号通信---信号集函数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27312943/article/details/79101160

  信号处理的方法主要有两种,一种是使用signal()函数,另一种是使用信号集函数组。

实例

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



/*自定义的信号处理函数*/
void my_func(int sign_no)
{
    if(sign_no == SIGINT)
    {
        printf("\ni have get SIGINT\n");			
    }
    if(sign_no == SIGQUIT)
    {
    	printf("\ni have get SIGQUIT\n");
    }
}



int main()
{
    sigset_t set,pendset;
    struct sigaction action1,action2;
    /*初始化信号集为空*/
    if(sigemptyset(&set) <0)
    {
    	printf("sigemptyset error\n");
    	exit(1);    	
    }
   
    /*将相应的信号加入信号集*/    
    if(sigaddset(&set,SIGINT) < 0)
    {
        printf("sigaddset error\n");
        exit(1);	
    }
    if(sigaddset(&set,SIGQUIT) < 0)
    {
        printf("sigaddset error\n");
        exit(1);	
    }
    /*sigismember()查询指定信号是否在信号集中*/
    if(sigismember(&set,SIGINT))
    {
    	sigemptyset(&action1.sa_mask);
    	action1.sa_handler=my_func;  //指定信号处理函数
    	action1.sa_flags=0;  //sa_flags中包含了许多标志位,是对信号进行处理的各个选择项。
    	
    	
    	/***********************
    	函数原型:int sigaction(int signum,
    	                        const struct sigaction *act ,
    	                        struct sigaction *oldact);
    	函数参数:signum 信号代码
    	          act    指向sigaction的一个实例的指针,指定对特定信号的处理
    	          oldact 保存原来对相应信号的处理
    	***************************/
    	sigaction(SIGINT,&action1,NULL);
    }
    
    if(sigismember(&set,SIGQUIT))
    {
    	sigemptyset(&action2.sa_mask);
    	action2.sa_handler=my_func;  //采用默认的处理方式
    	action2.sa_flags=0;  //sa_flags中包含了许多标志位,是对信号进行处理的各个选择项。
    	
    	
    	/***********************
    	函数原型:int sigaction(int signum,
    	                        const struct sigaction *act ,
    	                        struct sigaction *oldact);
    	函数参数:signum 信号代码
    	          act    指向sigaction的一个实例的指针,指定对特定信号的处理
    	          oldact 保存原来对相应信号的处理
    	***************************/
    	sigaction(SIGQUIT,&action2,NULL);
    }    
    
    /*设置信号集屏蔽字,此时set中的信号不会被传递给进程,暂时进入等待处理状态*/
    if(sigprocmask(SIG_BLOCK,&set,NULL)<0)
    {
        printf("sigprocmask error\n");
        exit(1);	    	
    }
    else
    {
    	/*信号被设置为阻塞状态*/
        printf("signal set was blocked,Press any key:\n");	
        getchar();
    }
    /*在信号屏蔽字中删除set中的信号*/
    if(sigprocmask(SIG_UNBLOCK,&set,NULL) < 0)
    {
        printf("sigprocmask error\n");
        exit(1);	
    }
    else
    {
        printf("signal set is unblock state\n");	
    }
    
    while(1);
    return 0;	
}
运行结果


猜你喜欢

转载自blog.csdn.net/qq_27312943/article/details/79101160
今日推荐