sigsuspend--让进程挂起,等到特定的信号(而int pause(void)等的是任意的信号)才继续执行,就是先不动再动;
而signal函数相反--运行等到特定信号去运行信号处理函数,就是先动再不动(如遇到ctrl-c是停止,其实很多情形不是这样,只是方便记忆而已。)
int sigsuspend(const sigset_t *set);
void *signal(int signum, void * handler);
sigsuspend函数等的是*set中值为0的bit(因为值为1的bit被屏蔽掉了)。看例子更直观:
example:
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
int main(void)
{
void sig_int(int);
sigset_t newmask, oldmask, zeromask;
if(signal(SIGINT,sig_int)==SIG_ERR)
{
puts("signal (SIGINT) error");
return 0;
}
if(signal(SIGQUIT,sig_int)==SIG_ERR)
{
puts("signal (SIGQUIT) error");
return 0;
}
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);//把SIGINT加入newmask
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)//此时信号掩码=SIGINT即屏蔽SIGINT
{
puts("SIG_BLOCK error");
return 0;
}
sigaddset(&zeromask,~SIGINT);
// zeromask中除了SIGINT对应的bit为0其余都为1
//等的是值为0的bit(因为值为1的bit被屏蔽掉了,这里是用zeromask的各bit来看的,不是以信号掩码来看的),
//即现在等的是SIGINT
sigsuspend(&zeromask);//进程挂起,等待SIGINT
if(sigismember(&zeromask,SIGINT))//肯定没有啦
{
puts("catch signal SIGINT");
}
//quitflag=0;
if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
return(0);
}
void sig_int(int signumber)
{
if(signumber==SIGQUIT)
printf("\nSIGQUIT\n");
else if(signumber==SIGINT)
puts("SIGINT comes.");
return;
}
/*
output:
运行./a.out,开始在等待,当press ctrl-c时:
[lyt9469@localhost signal]$ g++ sigsuspend.c
[lyt9469@localhost signal]$ ./a.out
SIGINT comes.
*/