输出
$ ./ctest &
[1] 7432
starting main: SIGQUIT
$ kill -USR1 7432
starting sig_usr1: SIGQUIT SIGUSR1
$ in sig_alrm: SIGQUIT SIGUSR1 SIGALRM
finishing sig_usr1: SIGQUIT SIGUSR1
ending main: SIGQUIT
#include <stdlib.h>
#include <setjmp.h>
#include <time.h>
#include <signal.h>
#include <apue.h>
static void sig_usr1(int);
static void sig_alrm(int);
static sigjmp_buf jmpbuf;
static volatile __sig_atomic_t canjump;
int
main(int argc,char **argv)
{
if(signal(SIGUSR1,sig_usr1) == SIG_ERR)
err_sys("signal(SIGUSR1) error");
if(signal(SIGALRM,sig_alrm) == SIG_ERR)
err_sys("signal(SIGALRM) error");
pr_mask("starting main: ");
if(sigsetjmp(jmpbuf,1)){
pr_mask("ending main: ");
exit(0);
}
canjump = 1;
for( ; ; ){
pause();
}
exit(0);
}
static void sig_usr1(int signo){
time_t start_time;
if(canjump == 0)
return;
pr_mask("starting sig_usr1: ");
alarm(3);
start_time = time(NULL);
for( ; ; )
if(time(NULL) > start_time + 5)
break;
pr_mask("finishing sig_usr1: ");
canjump = 0;
siglongjmp(jmpbuf,1);
}
static void
sig_alrm(int signo){
pr_mask("in sig_alrm: ");
}