man sigemptyset 集合。囊括标准集合信号的个数。sigset_t 位图的形式。 emptyset fillset全集 包含所有信号。 sigaddset sigdelset sigismember 判断。


(int how,const sigset_t *set,sigset_t *oldset) ;做how 的操作。 返回值。

 
#include <signal.h>
 
static void int_handler(int s)
{
	write(1,"!",1);
}
int main()
{
 
	int i;
	//signal(SIGINT,SIG_IGN); //忽略
	signal(SIGINT,int_handler);//指定响应方式
	//往屏幕打印信号 1s打印一个
	for(i=0;i<10;i++)
	{
		write(1,"*",1);
		sleep(1);
	}
	
	exit(0);
}

每秒打印一个星号。ctrl+c 会响应打印一个叹号,但多个ctrl+c会打断当前阻塞的系统调用。 改动:

for(j=0;j<1000;j++)
{
	for(i=0;i<5;i++)
	{
		write(1,"*",1);
		sleep(1);
	}
	write(1,"\n",1);
}

内部循环每秒打印一个星号 打印五个之后换行开始打印下一行。

ctrl+\ sigquit快捷方式 实现的功能: 在两行之间响应星号。阻塞信号。之后再响应。 先把信号放到集合当中去,在代码执行之前首先把所有集合block住,即把集合中信号的mask位置为0.屏蔽阻塞,接触阻塞。

sigset_t set;
sigemptyset(&set)
sigaddset(&set,SIGINT);//这个集合中只有这么一个信号存在
for(j=0;j<1000;j++)
{
	sigprocmask(SIG_BLOCK,&set,NULL);
	for(i=0;i<5;i++)
	{
		write(1,"*",1);
		sleep(1);
	}
	write(1,"\n",1);
	sigprocmask(SIG_UNBLOCK,&set,NULL);
}

多个信号只有一个响应,反映到Pending 是位图。标准信号的丢失。 宏观编程的意识:大规模中的小函数。解除了阻塞。确定进入退出这个模块全局状态不会改变。保存恢复工作。

sigset_t saveset;
sigprocmask(SIG_UNBLOCK,&set,&saveset);
 
 
//end
sigprockmask(SIG_SETMASK,&saveset,NULL);

setmask

sigset_t set,oset;
sigemptyset(&set)
sigaddset(&set,SIGINT);//这个集合中只有这么一个信号存在
for(j=0;j<1000;j++)
{
	
	sigprocmask(SIG_BLOCK,&set,&oset);
	for(i=0;i<5;i++)
	{
		write(1,"*",1);
		sleep(1);
	}
	write(1,"\n",1);
	sigprocmask(SIG_SETMASK,&oset,NULL);
}

阻塞保存之前的状态恢复之前的状态