1 /* $OpenBSD: signal.c,v 1.3 2001/11/11 23:26:35 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 void * 18 sleeper(arg) 19 void *arg; 20 { 21 sigset_t mask; 22 23 /* Ignore all signals in this thread */ 24 sigfillset(&mask); 25 CHECKe(sigprocmask(SIG_SETMASK, &mask, NULL)); 26 ASSERT(sleep(3) == 0); 27 SUCCEED; 28 } 29 30 void 31 handler(sig) 32 int sig; 33 { 34 int save_errno = errno; 35 36 alarmed = 1; 37 alarm(1); 38 signal(SIGALRM, handler); 39 errno = save_errno; 40 } 41 42 int 43 main() 44 { 45 pthread_t slpr; 46 47 ASSERT(signal(SIGALRM, handler) != SIG_ERR); 48 CHECKe(alarm(1)); 49 CHECKr(pthread_create(&slpr, NULL, sleeper, NULL)); 50 /* ASSERT(sleep(1) == 0); */ 51 for (;;) { 52 if (alarmed) { 53 alarmed = 0; 54 CHECKe(write(STDOUT_FILENO, "!", 1)); 55 } 56 } 57 } 58