1 /* $OpenBSD: signal.c,v 1.5 2003/07/31 21:48:06 deraadt Exp $ */ 2 /* David Leonard <d@openbsd.org>, 2001. Public Domain. */ 3 4 /* 5 * This program tests signal handler re-entrancy. 6 */ 7 8 #include <pthread.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <unistd.h> 12 #include <signal.h> 13 #include "test.h" 14 15 volatile int alarmed; 16 17 static void * 18 sleeper(void *arg) 19 { 20 sigset_t mask; 21 22 /* Ignore all signals in this thread */ 23 sigfillset(&mask); 24 CHECKe(sigprocmask(SIG_SETMASK, &mask, NULL)); 25 ASSERT(sleep(3) == 0); 26 CHECKe(write(STDOUT_FILENO, "\n", 1)); 27 SUCCEED; 28 } 29 30 static void 31 handler(int sig) 32 { 33 int save_errno = errno; 34 35 alarmed = 1; 36 alarm(1); 37 signal(SIGALRM, handler); 38 errno = save_errno; 39 } 40 41 int 42 main(int argc, char *argv[]) 43 { 44 pthread_t slpr; 45 46 ASSERT(signal(SIGALRM, handler) != SIG_ERR); 47 CHECKe(alarm(1)); 48 CHECKr(pthread_create(&slpr, NULL, sleeper, NULL)); 49 /* ASSERT(sleep(1) == 0); */ 50 for (;;) { 51 if (alarmed) { 52 alarmed = 0; 53 CHECKe(write(STDOUT_FILENO, "!", 1)); 54 } 55 } 56 } 57