信号屏蔽字,sigsetjmp和siglongjmp
<>
//10-14信号屏蔽字,sigsetjmp和siglongjmp #include
#include
#include
#include
#include
#include
static void sig_usr1(int),sig_alrm(int); static sigjmp_buf jmpbuf; static volatile sig_atomic_t canjump;
pr_mask(const char *str); static void
int main(void )
{
if(signal(SIGUSR1, sig_usr1) == SIG_ERR)
"signal(sigusr) error"); perror(
if (signal(SIGALRM, sig_alrm) == SIG_ERR)
perror("signal(sig_alarm) error");
main: "); pr_mask("starting
if (sigsetjmp(jmpbuf,1)){
"ending main: "); printf(
exit(0);
}
canjump = 1;
for ( ; ; )
pause();
}
static void sig_usr1(int signo) {
time_t starttime; if (canjump == 0)
return ;
pr_mask("starting sig_usr1: "); alarm(3);
starttime = time(NULL); for ( ; ; )
if (time(NULL) > starttime +5 )
break;
pr_mask("finishing sig_usr1: "); canjump = 0;
siglongjmp(jmpbuf,1);
}
static void sig_alrm(int signo ) {
printf("in sig_alrm\n");
}
void pr_mask(const char *str) {
sigset_t sigset; int errno_save;
errno_save = errno;
sigprocmask(0, NULL, &sigset) < 0) if (
perror("sigprocmask error"); printf("%s", str);
if (sigismember(&sigset, SIGINT))
printf("SIGINT ");
sigismember(&sigset, SIGQUIT)) if (
printf("SIGQUIT ");
if (sigismember(&sigset, SIGUSR1))
("SIGUSR1 "); printf
if (sigismember(&sigset, SIGUSR2))
"SIGUSR2 "); printf(
if (sigismember(&sigset, SIGALRM))
printf("SIGALRM ");
printf("\n");
errno = errno_save; }