linux的信号学习 ,signal(),sigaction()

1,signal()

  使用signal()函数处理时,只需指出要处理的信号和处理函数即可


  sa_handler 是一个函数指针,指

    sa_mask 是一个信号集,它可以指定在信号处理程序执行过程中哪些信号应当被屏蔽,在调用信号捕获函数前,该信号集要加入到信号的信号屏蔽字中。

    sa_flags 中包含了很多标志位,是对信号进行处理的各个选择项。它的常见可选值如下表所示:

#include<signal.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
void signal_fun(int signo)
{
	if(signo==SIGINT)
	{
		printf("I get a SIGINT\n");
	}
	else if (signo==SIGQUIT)
	{
		printf("I get a SIGQUIT\n");
	}
}

int main()
{
	printf("Waiting for signal to be sent......\n ");
	signal(SIGINT,signal_fun);//第二个参数是函数的指针
	signal(SIGQUIT,signal_fun);
	pause();//将进程挂起来,等待信号的发送
	exit(0);
}
addia@addia-Lenovo-B470:~/演示代码$ ./signal
Waiting for signal to be sent......
^\ I get a SIGQUIT
addia@addia-Lenovo-B470:~/演示代码$ ./signal
Waiting for signal to be sent......
^C I get a SIGINT

#include<signal.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
void signal_fun(int signo)
{
	if(signo==SIGINT)
	{
		printf("I get a SIGINT\n");
	}
	else if (signo==SIGQUIT)
	{
		printf("I get a SIGQUIT\n");
	}
}

int main()
{
	struct sigaction action;//定义结构体
	printf("Waiting for signal to be sent......\n ");
	//初始化
	action.sa_handler=signal_fun;
	sigemptyset(&action.sa_mask);
	action.sa_flags=0;//相当于SA_NOMASK  
	<span style="background-color: rgb(255, 102, 0);">//action.sa_flags=SA_RESETHAND;</span>

	sigaction(SIGINT,&action,0);
	sigaction(SIGQUIT,&action,0);
	printf("the first signal");
	pause();//将进程挂起来,等待信号的发送
	printf("the second signal");
	pause();//将进程挂起来,等待信号的发送
	exit(0);
}
  

  

    


  

/* sigset.c */
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>

/*自定义的信号处理函数*/
void my_func(int signum)
{
	printf("If you want to quit,please try SIGQUIT\n");
}

int main()
{
	sigset_t set,pendset;/*定义信号集*/
	struct sigaction action1,action2;

	/*初始化信号集为空*/
	if(sigemptyset(&set)<0)
	{                          /*void perror(const char *s);功能:用来将上一个*/
		perror("sigemptyset"); /*函数发生错误的原因输出标准设备(stderr),参数s*/
		exit(1);              /*所指的字符串会先打印出,后面再加上错误原因字符串*/
	}						  /*此错误原因依照全局变量errno的值来决定要输出的字符串*/

	/*将相应的信号加入信号集*/
	if(sigaddset(&set,SIGQUIT)<0)
	{
		perror("sigaddset");
		exit(1);
	}
	if(sigaddset(&set,SIGINT)<0)
	{
		perror("sigaddset");
		exit(1);
	}
	/*查询SIGINT信号是否在信号集中*/
	if(sigismember(&set,SIGINT))/*成功返回1*/
	{
		/*sigaction结构初始化*/
		sigemptyset(&action1.sa_mask);
		action1.sa_handler=my_func;
		action1.sa_flags=0;
		/*等待发出相应的信号,并跳转到信号处理函数处*/
		sigaction(SIGINT,&action1,NULL);
	}

	if(sigismember(&set,SIGQUIT))
	{
		sigemptyset(&action2.sa_mask);
		action2.sa_handler=SIG_DFL;/*采用系统默认方式处理该信号*/
		action2.sa_flags=0;
		sigaction(SIGQUIT,&action2,NULL);
	}

	/*设置信号屏蔽字,此时set中的信号不会被传递给进程,暂时进入待处理状态*/
	if(sigprocmask(SIG_BLOCK,&set,NULL)<0)
	{
		perror("sigprocmask");
		exit(1);
	}
	else
	{
		printf("Signal set was blocked,Press any key!");
		getchar();  /*这就是输入任意键的关键,你不输入任意键,程序就一直停在这里*/
	}

	/*在信号屏蔽字中删除 set 中的信号*/
	if(sigprocmask(SIG_UNBLOCK,&set,NULL)<0)
	{
		perror("sigprocmask");
		exit(1);
	}
	else
	{
		printf("Signal set is in unblock state\n");
	}

	while(1);
	exit(0);
}/*end*/
addia@addia-Lenovo-B470:~/演示代码$ ./sig
Signal set was blocked,Press any key!^[[A
Signal set is in unblock state
^CIf you want to quit,please try SIGQUIT
^\退出 (核心已转储)
addia@addia-Lenovo-B470:~/演示代码$ ./sig
Signal set was blocked,Press any key!^[[A
Signal set is in unblock state
^\退出 (核心已转储)
参考来自:blog.csdn.net/mybelief321/article/details/9079145


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值