C Language and Libraries Help (clang.hlp) (Table of Contents; Topic list)
SIGNAL.C
                                             Up Contents Index Back
─────Run-Time Library───────────────────────────────────────────────────────
 
/* SIGNAL.C illustrates setting up signal interrupt routines. Functions
 * illustrated include signal and raise.
 *
 * Since C I/O functions are not safe inside signal routines, the code
 * uses conditionals to use system-level DOS services. Another option
 * is to set global flags and do any I/O operations outside the
 * signal handler.
 */
 
#include <stdio.h>
#include <conio.h>
#include <signal.h>
#include <process.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
 
void ctrlchandler( int sig );          /* Prototypes */
void safeout( char *str );
int  safein( void );
 
void main( void )
{
   int ch;
   /* Install signal handler to modify CTRL+C behavior. */
   if( signal( SIGINT, ctrlchandler ) == SIG_ERR )
   {
      fprintf( stderr, "Couldn't set SIGINT\n" );
      abort();
   }
 
   /* Loop prints message to screen asking user to
    * enter Cntl+C--at which point the ctrlchandler
    * signal handler takes control.
    */
   do
   {
      printf( "Press Ctrl+C to enter handler.\n" );
   }
   while( ch = _getch());   /* Discard keystokes */
}
 
/* A signal handler must take a single argument. The argument can be
 * tested within the handler and thus allows a single signal handler
 * to handle several different signals. In this case, the parameter
 * is included to keep the compiler from generating a warning but is
 * ignored because this signal handler only handles one interrupt:
 * SIGINT (Ctrl+C).
 */
void ctrlchandler( int sig )
{
   int c;
   char str[] = " ";
 
   /* Disallow CTRL+C during handler. */
   signal( SIGINT, SIG_IGN );
 
   safeout( "User break - abort processing (y|n)? " );
   c = safein();
   str[0] = c;
   safeout( str );
   safeout( "\r\n" );
   if( (c == 'y') || (c == 'Y') )
      abort();
   else
   {
      /* The CTRL+C interrupt must be reset to our handler since
       * by default it is reset to the system handler.
       */
      signal( SIGINT, ctrlchandler );
      safeout( "Press Ctrl+C to enter handler.\r\n" );
   }
}
 
/* Outputs a string using system level calls. */
void safeout( char *str )
{
   union _REGS inregs, outregs;
 
   inregs.h.ah = 0x0e;
   while( *str )
   {
      inregs.h.al = *str++;
      _int86( 0x10, &inregs, &outregs );
   }
}
 
/* Inputs a character using system level calls. */
int safein()
{
   return _bios_keybrd( _KEYBRD_READ ) & 0xff;
}
                                    -♦-