static volatile sig_atomic_t g_sigreceived=0;
void sig_handler(int signo)
{
printf("signo=%d\n", signo);
if(signo==SIGINT || signo==SIGQUIT || signo==SIGTERM)
{
g_sigreceived=1;
}
}
//功能:等待某个信号返回且不阻塞其它信号
void WaitSingSigAndNoBlockOthers(void)
{
struct sigaction newact,oldact;
sigset_t maskblocked,oldmask;
// set cur handler,save previous information
newact.sa_handler=sig_handler;
sigemptyset(&newact.sa_mask);
newact.sa_flags=0;
// block SIGINT and save current signal mask
sigprocmask(SIG_SETMASK,NULL,&maskblocked);
sigaddset(&maskblocked,SIGINT);
sigprocmask(SIG_BLOCK,&maskblocked,&oldmask);
sigaction(SIGINT,&newact,&oldact);
sigdelset(&maskblocked,SIGINT);
sigaddset(&maskblocked,SIGTERM);
sigprocmask(SIG_BLOCK,&maskblocked,&oldmask);
sigaction(SIGTERM,&newact,&oldact);
sigdelset(&maskblocked,SIGTERM);
sigaddset(&maskblocked,SIGQUIT);
sigprocmask(SIG_BLOCK,&maskblocked,&oldmask);
sigaction(SIGHUP,&newact,&oldact);
sigdelset(&maskblocked,SIGQUIT);
while(g_sigreceived==0)
sigsuspend(&maskblocked);
printf("wait SIGINT ok!\n");
sigprocmask(SIG_SETMASK,&oldmask,NULL);
}