Linux--测试信号阻塞及排队

不可靠信号

不可靠信号在被阻塞时,程序是不会响应信号处理的。这并不是说程序没收到信号,而是程序把接收到的信号放到了缓冲区,一旦该信号解除阻塞则会立即被发送一次(不可靠信号会丢失),之后程序可以正常响应信号处理。

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

void sig_usr(int signal)
{	
	if (signal == SIGQUIT)
	{
		printf("Received SIGQUIT signal!\n");
	}
}
int main()
{
	struct sigaction act;
	act.sa_handler = sig_usr;
	act.sa_flags = 0;
	sigemptyset(&act.sa_mask);
	sigaddset(&act.sa_mask, SIGQUIT); 		//添加SIGQUIT到信号集
	if (sigaction(SIGQUIT, &act, NULL) < 0) //设置SIGQUIT信号处理方式
	{
		printf("sigaction act error.\n");
		return -1;
	}
	printf("SIGQUIT signal blocked\n");
	sigprocmask(SIG_BLOCK, &act.sa_mask, NULL); 	//阻塞信号集
	sleep(10);
	printf("SIGQUIT signal unblocked\n");
	sigprocmask(SIG_UNBLOCK, &act.sa_mask, NULL);	//非阻塞信号集
	sleep(10);
	sleep(10);

	return 0;
}

在这里插入图片描述


可靠信号

可靠信号在被阻塞时,程序也是不会响应信号处理的。程序同样把接收到的信号放到了缓冲区,一旦该信号解除阻塞则会立即被发送,不同于不可靠信号的是可靠信号支持排队不丢失,缓存了几个信号就会被发送几次,之后程序同样可以正常响应信号处理。

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

void sig_usr(int signal)
{	
	if (signal == SIGRTMIN)
	{
		printf("Received SIGRTMIN signal!\n");
	}
}
int main()
{
	struct sigaction act;
	act.sa_handler = sig_usr;
	act.sa_flags = 0;
	sigemptyset(&act.sa_mask);
	sigaddset(&act.sa_mask, SIGRTMIN); 			 //添加SIGRTMIN信号到信号集
	if (sigaction(SIGRTMIN, &act, NULL) < 0)	 //设置SIGRTMIN信号处理方式
	{
		printf("sigaction act error.\n");
		return -1;
	}
	printf("SIGRTMIN signal blocked\n");
	sigprocmask(SIG_BLOCK, &act.sa_mask, NULL);  //阻塞信号集
	sleep(30);
	printf("SIGRTMIN signal unblocked\n");
	sigprocmask(SIG_UNBLOCK, &act.sa_mask, NULL);//非阻塞信号集
	sleep(10);
	sleep(10);

	return 0;
}

在这里插入图片描述


参考网址: http://www.cnblogs.com/encode/archive/2012/06/13/2547493.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值