linux信号被信号打断测试

linux信号打断信号研究

看到Unix环境高级编程的信号打断的时候有个疑问,用信号打断信号会怎么样?

#include 
#include 
void my_alarm(int signo)
{

		printf("I'm in My_alarm\n");
		raise(SIGUSR2);
		sleep(1);
		raise(SIGUSR2);
		raise(SIGUSR2);
		printf("I'm in My_alarm\n");

	
}
void my_sigusr(int signo)
{
	for(int i =0;i<5;i++)
	{
		printf("I'm in My_sigusr\n");
		sleep(1);
	}
}
void my_sigusr2(int signo)
{

		printf("I'm in My_sigusr2\n");
		sleep(1);
		printf("I'm in My_sigusr2\n");

	
}
void main(void)
{
	signal(SIGALRM,my_alarm);
	signal(SIGUSR1,my_sigusr);
	signal(SIGUSR2,my_sigusr2);

	alarm(2);
	raise(SIGUSR1);
	for(;;)
	{
		printf("I'm in main process\n");
		sleep(1);
	}
}

首先注册接下来要用的三个信号,然后在进入my_sigusr信号处理函数之后延时两秒后内核自动发送SIGALRM信号,尝试看看是否能打乱.

可以看到在运行了约两秒后,sigusr被alarm打断,借此证明信号是可以打断的.
然后在my_alarm函数中尝试发送信号给sigusr2,由图所示也也可以打断,同样的信号处理完之后都进入各自进来的地方.
在这里就有个疑问了,那么如果我在my_alarm中发送信号给my_sigusr会不会进入呢?

void my_alarm(int signo)
{

		printf("I'm in My_alarm\n");
		raise(SIGUSR1);
		sleep(1);
		raise(SIGUSR1);
		raise(SIGUSR1);
		printf("I'm in My_alarm\n");

	
}

my_alarm函数发送的信号修改为发送给usr1.

linux信号被信号打断测试_第1张图片
可以看到在my_alarm中发送完信号后并没有再次进入my_sigusr中,证明不能信号机制保证了信号不能重入.但是内核会将信号排着队,等待当前信号处理完之后再进入,可以看到发送了十次,和修改之前多进入了一次信号处理函数,但是应该是总共4*5+5=25个printf刷新,但是可以看到其实只增加了一次,也就是说内核在信号处理区间很有可能会丢弃掉信号,不能保证信号的数量一定是对的.

结论:linux的信号可以被其他信号打断,但是不能被相同的信号打断,同时打断信号期间的信号接收可能会丢失.

你可能感兴趣的:(linux)