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

猜你喜欢

转载自blog.csdn.net/Meteor_s/article/details/84999687