例如有SIGHUP的信号处理程序,someString是指向字符串的全局变量:
void handleHup(int signum)
{
free(someString);
someString=strdup("a different string.");
}
假设程序正在复制一个字符串的时候:
src=someString;
while(*src) *dest++=*src++;
一个SIGHUP信号到达,src将指向被释放的内存。
所以我们希望让一段代码不受信号的打扰,这要用到信号掩码(就是说明哪些信号可以不予响应,也叫阻塞)。
由函数:
int sigprocmask(int what,const sigset_t *set,sigset_t *oldset);
信号掩码这里都看不到他的影子,没用特定的东西保存他,总之,有两个东西,一是set,二是信号掩码,他们都是sigset_t类型。
当这样调用函数sigprocmask(0,NULL,&oldset);时,当前的信号掩码会复制一份到oldset。
what:1)SIG_BLOCK:把set中的信号加到当前信号掩码中。
2)SIG_UNBLOCK:把set中的信号从当前信号掩码中除掉。
3)SIG_SETMASK:把set的信号付给信号掩码。
example:
#include
#include
#include
#include
#include
void checkmask(sigset_t* sigset=NULL);//print sigset的信号集,默认print 信号掩码
int main()
{
char buffer[100];
sigset_t blockset,sigset;
sigemptyset(&blockset);
sigaddset(&blockset,SIGINT);//blockset=SIGINT、SIGTSTP
sigaddset(&blockset,SIGTSTP);
sigprocmask(SIG_SETMASK,&blockset,&sigset);//信号掩码=blockset,sigset保存的是上次的信号掩码
puts("first before sigprocmask,the mask:");
checkmask(&sigset);
puts("first after sigprocmask, the mask: ");
checkmask();
printf("-------------------\n");
sigaddset(&blockset,SIGTERM);
sigprocmask(SIG_BLOCK,&blockset,&sigset);//信号掩码|=blockset
puts("second before sigprocmask,the mask:");
checkmask(&sigset);
puts("second after sigprocmask, the mask: ");
checkmask();
printf("-------------------\n");
sigdelset(&blockset,SIGINT);
sigdelset(&blockset,SIGTERM);
sigprocmask(SIG_UNBLOCK,&blockset,&sigset);//信号掩码-=blockset
puts("third before sigprocmask,the mask:");
checkmask(&sigset);
puts("third after sigprocmask, the mask: ");
checkmask();
printf("---------------\nfinish!!\n");
return 0;
}
void checkmask(sigset_t *s)
{
sigset_t sigset;
if(s==NULL)
{
if(sigprocmask(0,NULL,&sigset)<0)//get 信号掩码
{
printf("Sigprocmask error");
return ;
}
}
else sigset=(*s);
if(sigismember(&sigset,SIGINT))
printf("SIGINT\n");
if(sigismember(&sigset,SIGTSTP))
printf("SIGTSTP\n");
if(sigismember(&sigset,SIGTERM))
printf("SIGTERM\n");
}
//output:
/*
first before sigprocmask,the mask:
first after sigprocmask, the mask:
SIGINT
SIGTSTP
-------------------
second before sigprocmask,the mask:
SIGINT
SIGTSTP
second after sigprocmask, the mask:
SIGINT
SIGTSTP
SIGTERM
-------------------
third before sigprocmask,the mask:
SIGINT
SIGTSTP
SIGTERM
third after sigprocmask, the mask:
SIGINT
SIGTERM
---------------
finish!!
*/