int main(int argc,char *argv[]) { struct sigaction sa; print_sigmask(stdout,"Signal mask at startup: \n"); sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; if (sigaction(SIGINT,&sa,NULL) == -1) { perror("sigaction failed"); exit(-1); } #ifdef USE_SIGSETJMP printf("Calling sigsetjmp to set a jump-point\n"); if (sigsetjmp(senv,1) == 0) { #else printf("Calling setjmp to set a jump-point\n"); if (setjmp(env) == 0) { #endif canJump = 1; } else { print_sigmask(stdout,"After jump from handler,signal mask is: \n"); } for (;;) pause(); }
int main(int argc, char *argv[]) { int sleep_time; struct sigaction sa; sigset_t block_mask; sleep_time = (argc > 1) ? atoi(argv[1]) : 5; if (sleep_time <= 0) { fprintf(stderr, "sleep-time %s > 0\n", argv[1]); exit(EXIT_FAILURE); } sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGCONT, &sa, NULL) == -1) { perror("sigaction"); exit(EXIT_FAILURE); } sigemptyset(&block_mask); sigaddset(&block_mask, SIGCONT); if (sigprocmask(SIG_BLOCK, &block_mask, NULL) == -1) { perror("sigprocmask"); exit(EXIT_FAILURE); } printf("set signal mask SIGCONT\n"); print_sigmask(stdout, "SIGNAL MASK:\n"); printf("sleep %ds.\n", sleep_time); printf("type <Ctrl-Z>. Then, type 'kill -CONT %ld\n", (long) getpid()); sleep(sleep_time); printf("sleep finished.\n"); print_sigmask(stdout, "SIGNAL MASK:\n"); print_pending_sigs(stdout, "PENDINGS:\n"); printf("unset signal mask SIGCONT\n"); if (sigprocmask(SIG_UNBLOCK, &block_mask, NULL) == -1) { perror("sigprocmask"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
static void handler(int sig) { printf("Received signal %d (%s)\n", sig, strsignal(sig)); printf("signal mask is:\n"); print_sigmask(stdout,NULL); if (!canJump) { printf("'env' buffer not yet set,doing a simple return"); return; } #ifdef USE_SIGSETJMP siglongjmp(senv,1); #else longjmp(env,1); #endif }
static void handler(int sig) { /* UNSAFE: This handler uses non-async-signal-safe functions * (printf(), strsignal(), print_sigmask(); see section 21.1.2) */ printf("Received signal %d (%s), signal mask is:\n", sig, strsignal(sig)); print_sigmask(stdout, NULL); if (!can_jump) { printf("'env' buffer not yet set, doing a simple return\n"); return; } #ifdef USE_SIGSETJMP siglongjmp(senv, 1); #else longjmp(env, 1); #endif }