/* * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. * On-Line Applications Research Corporation (OAR). * All rights assigned to U.S. Government, 1994. * * This material may be reproduced by or for the U.S. Government pursuant * to the copyright license under the clause at DFARS 252.227-7013. This * notice must appear in all copies of this file and its derivatives. * * $Id$ */ #define CONFIGURE_INIT #include "system.h" #include volatile int Signal_occurred; volatile int Signal_count; void Signal_handler( int signo ) { Signal_count++; printf( "Signal: %d caught by 0x%x (%d)\n", signo, pthread_self(), Signal_count ); Signal_occurred = 1; } void *POSIX_Init( void *argument ) { int status; struct sigaction act; sigset_t mask; sigset_t pending_set; puts( "\n\n*** POSIX TEST 4 ***" ); /* set the time of day, and print our buffer in multiple ways */ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 ); /* get id of this thread */ Init_id = pthread_self(); printf( "Init's ID is 0x%08x\n", Init_id ); /* install a signal handler for SIGUSR1 */ status = sigemptyset( &act.sa_mask ); assert( !status ); act.sa_handler = Signal_handler; act.sa_flags = 0; sigaction( SIGUSR1, &act, NULL ); /* simple signal to process */ Signal_count = 0; Signal_occurred = 0; printf( "Init: send SIGUSR1 to process\n" ); status = kill( getpid(), SIGUSR1 ); assert( !status ); Signal_occurred = 0; /* now block the signal, send it, see if it is pending, and unblock it */ empty_line(); status = sigemptyset( &mask ); assert( !status ); status = sigaddset( &mask, SIGUSR1 ); assert( !status ); printf( "Init: Block SIGUSR1\n" ); status = sigprocmask( SIG_BLOCK, &mask, NULL ); assert( !status ); status = sigpending( &pending_set ); assert( !status ); printf( "Init: Signals pending 0x%08x\n", pending_set ); printf( "Init: send SIGUSR1 to process\n" ); status = kill( getpid(), SIGUSR1 ); assert( !status ); status = sigpending( &pending_set ); assert( !status ); printf( "Init: Signals pending 0x%08x\n", pending_set ); printf( "Init: Unblock SIGUSR1\n" ); status = sigprocmask( SIG_UNBLOCK, &mask, NULL ); assert( !status ); /* now let another task get interrupted by a signal */ empty_line(); printf( "Init: create a thread interested in SIGUSR1\n" ); status = pthread_create( &Task_id, NULL, Task_1_through_3, NULL ); assert( !status ); printf( "Init: Block SIGUSR1\n" ); status = sigprocmask( SIG_BLOCK, &mask, NULL ); assert( !status ); status = sigpending( &pending_set ); assert( !status ); printf( "Init: Signals pending 0x%08x\n", pending_set ); printf( "Init: sleep so the other task can block\n" ); status = sleep( 1 ); assert( !status ); /* switch to task 1 */ printf( "Init: send SIGUSR1 to process\n" ); status = kill( getpid(), SIGUSR1 ); assert( !status ); status = sigpending( &pending_set ); assert( !status ); printf( "Init: Signals pending 0x%08x\n", pending_set ); printf( "Init: sleep so the other task can catch signal\n" ); status = sleep( 1 ); assert( !status ); /* switch to task 1 */ /* test alarm */ empty_line(); /* install a signal handler for SIGALRM and unblock it */ status = sigemptyset( &act.sa_mask ); assert( !status ); act.sa_handler = Signal_handler; act.sa_flags = 0; sigaction( SIGALRM, &act, NULL ); status = sigemptyset( &mask ); assert( !status ); status = sigaddset( &mask, SIGALRM ); assert( !status ); printf( "Init: Unblock SIGALRM\n" ); status = sigprocmask( SIG_UNBLOCK, &mask, NULL ); assert( !status ); /* schedule the alarm */ printf( "Init: Firing alarm in 5 seconds\n" ); status = alarm( 5 ); printf( "Init: %d seconds left on previous alarm\n", status ); assert( !status ); printf( "Init: Firing alarm in 2 seconds\n" ); status = alarm( 2 ); printf( "Init: %d seconds left on previous alarm\n", status ); assert( status ); printf( "Init: Wait 4 seconds for alarm\n" ); status = sleep( 4 ); printf( "Init: %d seconds left in sleep\n", status ); assert( status ); /* exit this thread */ puts( "*** END OF POSIX TEST 4 ***" ); exit( 0 ); return NULL; /* just so the compiler thinks we returned something */ }