int main(int argc, char *argv[]) { struct sigaction sa; printSigMask(stdout, "Signal mask at startup:\n"); sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; if (sigaction(SIGINT, &sa, NULL) == -1) errExit("sigaction"); #ifdef USE_SIGSETJMP printf("Calling sigsetjmp()\n"); if (sigsetjmp(senv, 1) == 0) #else printf("Calling setjmp()\n"); if (setjmp(env) == 0) #endif canJump = 1; /* Executed after [sig]setjmp() */ else /* Executed after [sig]longjmp() */ printSigMask(stdout, "After jump from handler, signal mask is:\n" ); for (;;) /* Wait for signals until killed */ pause(); }
int main(int argc, char *argv[]) { struct sigaction sa; printSigMask(stdout, "Signal mask at startup:\n"); sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; if (sigaction(SIGINT, &sa, NULL) == -1) { errExit("sigaction"); } #ifdef USE_SIGSETJMP printf("calling sigsetjmp()\n"); if (sigsetjmp(senv, 1) == 0) { #else printf("Calling setjmp()\n"); if (setjmp(env) == 0) { #endif canJump = 1; } else { printSigMask(stdout, "After jump from handler, signal mask is:\n"); } for (;;) { pause(); } exit(EXIT_SUCCESS); }
int main(int argc, char *argv[]) { int loopNum; time_t startTime; sigset_t origMask, blockMask; struct sigaction sa; printSigMask(stdout, "Initial signal mask is:\n"); sigemptyset(&blockMask); sigaddset(&blockMask, SIGINT); sigaddset(&blockMask, SIGQUIT); if (sigprocmask(SIG_BLOCK, &blockMask, &origMask) == -1) errExit("sigprocmask - SIG_BLOCK"); sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; if (sigaction(SIGINT, &sa, NULL) == -1) errExit("sigaction"); if (sigaction(SIGQUIT, &sa, NULL) == -1) errExit("sigaction"); for (loopNum = 1; !gotSigquit; loopNum++) { printf("=== LOOP %d\n", loopNum); /* Simulate a critical section by delaying a few seconds */ printSigMask(stdout, "Starting critical section, signal mask is:\n"); for (startTime = time(NULL); time(NULL) < startTime + 4; ) continue; /* Run for a few seconds elapsed time */ printPendingSigs(stdout, "Before sigsuspend() - pending signals:\n"); if (sigsuspend(&origMask) == -1 && errno != EINTR) errExit("sigsuspend"); } if (sigprocmask(SIG_SETMASK, &origMask, NULL) == -1) errExit("sigprocmask - SIG_SETMASK"); printSigMask(stdout, "=== Exited loop\nRestored signal mask to:\n"); /* Do other processing... */ exit(EXIT_SUCCESS); }
static int returnTest1 (void) { sighandler_t prev; printf ("===== TEST 1 =====\n"); printf ("Blocking signal with sighold()\n"); if (sighold (TEST_SIG) == -1) error (1, errno, "sighold"); printSigMask ("Signal mask after sighold()\n"); printf ("About to use sigset() to establish handler\n"); prev = sigset (TEST_SIG, handler); if (prev == SIG_ERR) error(1, errno, "sigset"); printf ("Previous disposition: "); printDisposition (prev); printf (" (should be SIG_HOLD)\n"); if (prev != SIG_HOLD) { printf("TEST FAILED!!!\n"); return 1; } return 0; } /* returnTest1 */
static void handler (int sig) { printf ("Caught signal %d\n", sig); printSigMask ("Signal mask in handler\n"); printf ("Handler returning\n"); _exit (1); } /* handler */
int main(int argc,char *argv[]) { printf("To print the Signal Mask for this process\n"); printSigMask(stdout,"Signal Mask of this process is"); exit(0); }
static void handler(int sig) { // UNSAFE printf("Received signal %d (%s), signal mask is:\n", sig, strsignal(sig)); printSigMask(stdout, NULL); if (!canJump) { printf("'env' buffer not yet set, doing a simple return\n"); 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(), printSigMask(); see Section 21.1.2) */ printf("Received signal %d (%s), signal mask is:\n", sig, strsignal(sig)); printSigMask(stdout, NULL); if (!canJump) { printf("'env' buffer not yet set, doing a simple return\n"); return; } #ifdef USE_SIGSETJMP siglongjmp(senv, 1); #else longjmp(env, 1); #endif }
int main(int argc, char *argv[]) { int loopNum; #ifdef USE_PAUSE int sleepTime; #endif time_t startTime; sigset_t origMask, blockMask; struct sigaction sa; printSigMask(stdout, "Initial signal mask is:\n"); sigemptyset(&blockMask); sigaddset(&blockMask, SIGINT); sigaddset(&blockMask, SIGQUIT); #ifdef USE_PAUSE sleepTime = (argc > 1) ? getInt(argv[1], GN_NONNEG, NULL) : 0; #endif /* Block SIGINT and SIGQUIT - at this point we assume that these signals are not already blocked (obviously true in this simple program) so that 'origMask' will not contain either of these signals after the call. */ if (sigprocmask(SIG_BLOCK, &blockMask, &origMask) == -1) errExit("sigprocmask - SIG_BLOCK"); /* Set up handlers for SIGINT and SIGQUIT */ sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; if (sigaction(SIGINT, &sa, NULL) == -1) errExit("sigaction"); if (sigaction(SIGQUIT, &sa, NULL) == -1) errExit("sigaction"); /* Loop until SIGQUIT received */ for (loopNum = 1; !gotSigquit; loopNum++) { printf("=== LOOP %d\n", loopNum); /* Simulate a critical section by delaying a few seconds */ printSigMask(stdout, "Starting critical section, signal mask is:\n"); for (startTime = time(NULL); time(NULL) < startTime + 4; ) continue; /* Run for a few seconds elapsed time */ #ifndef USE_PAUSE /* The right way: use sigsuspend() to atomically unblock signals and pause waiting for signal */ printPendingSigs(stdout, "Before sigsuspend() - pending signals:\n"); if (sigsuspend(&origMask) == -1 && errno != EINTR) errExit("sigsuspend"); #else /* The wrong way: unblock signal using sigprocmask(), then pause() */ if (sigprocmask(SIG_SETMASK, &origMask, NULL) == -1) errExit("sigprocmask - SIG_SETMASK"); /* At this point, if SIGINT arrives, it will be caught and handled before the pause() call and, in consequence, pause() will block. (And thus only another SIGINT signal AFTER the pause call() will actually cause the pause() call to be interrupted.) Here we make the window between the two calls a bit larger so that we have a better chance of sending the signal. */ if (sleepTime > 0) { printf("Unblocked SIGINT, now waiting for %d seconds\n", sleepTime); for (startTime = time(NULL); time(NULL) < startTime + sleepTime; ) continue; printf("Finished waiting - now going to pause()\n"); } /* And now wait for the signal */ pause(); printf("Signal count = %d\n", sigintCnt); sigintCnt = 0; #endif } /* Restore signal mask so that signals are unblocked */ if (sigprocmask(SIG_SETMASK, &origMask, NULL) == -1) errExit("sigprocmask - SIG_SETMASK"); printSigMask(stdout, "=== Exited loop\nRestored signal mask to:\n"); /* Do other processing... */ exit(EXIT_SUCCESS); }