/* ---------------------------------------------------------------- */
/* PROGRAM sig-4.c:                                                 */
/*   This program illustrates the way of handling two signals, each */
/* which has its own signal handler.                                */
/* ---------------------------------------------------------------- */

#include  <stdio.h>
#include  <stdlib.h>
#include  <signal.h>

#define   MAX_i    10000
#define   MAX_j    20000

#define   MAX_SECOND  (2)

void  INThandler(int);                  /* Ctrl-C handler           */
void  ALARMhandler(int);                /* alarm clock handler      */

int  SECOND;                            /* # of seconds for alarm   */
int  i, j;

/* ---------------------------------------------------------------- */
/* FUNCTION  INThandler:                                            */
/*    This function handles the SIGINT (Ctrl-C) signal.             */
/* ---------------------------------------------------------------- */

void  INThandler(int sig)
{
     char  c;
     
     signal(SIGINT, SIG_IGN);           /* ignore Ctrl-C            */
     signal(SIGALRM, SIG_IGN);          /* ignore alarm             */
     printf("*** INT handler --> You just hit Ctrl-C\n");
     printf("*** INT handler --> current values of i and j = %d and %d\n",
             i, j);
     printf("*** INT handler --> Do you really want to quit? [y/n] ");
     c = tolower(getchar());            /* get a response           */
     if (c == 'y') {
          printf("*** INT handler --> Program halts due to your request.\n");
          exit(0);
     }
     signal(SIGINT, INThandler);        /* reinstall Ctrl-C         */
     signal(SIGALRM, ALARMhandler);     /* reinstall alarm signal   */
     alarm(SECOND);
}

/* ---------------------------------------------------------------- */
/* FUNCTION  ALARMhandler:                                          */
/*    This function handles the SIGALRM (alarm clock) signal.       */
/* ---------------------------------------------------------------- */

void  ALARMhandler(int sig)
{
     signal(SIGINT, SIG_IGN);           /* ignore ctrl-C            */
     signal(SIGALRM, SIG_IGN);          /* ignore alarm             */
     printf("*** ALARM handler --> an alarm signal arrives\n");
     printf("*** ALARM handler --> current values of i and j = %d and %d\n",
             i, j);
     alarm(SECOND);                     /* set alarm clock          */
     signal(SIGINT, INThandler);        /* reinstall Ctrl-C         */
     signal(SIGALRM, ALARMhandler);     /* reinstall alarm signal   */
}

/* ---------------------------------------------------------------- */
/*                   main program starts here                       */
/* ---------------------------------------------------------------- */

void  main(int argc, char *argv[])
{
     long  sum;
     
     if (argc != 2) {
          printf("Use: %s time-interval\n", argv[0]);
          printf("Time interval set to default (%d).\n", MAX_SECOND);
          SECOND = MAX_SECOND;
     }
     else {
          SECOND = abs(atoi(argv[1]));
          if (SECOND == 0) {
               printf("Time interval must be positive.  Use default (%d).\n",
                      MAX_SECOND);
               SECOND = MAX_SECOND;
          }
     }
     signal(SIGINT, INThandler);
     signal(SIGALRM, ALARMhandler);
     alarm(SECOND);
     for (i = 1; i <= MAX_i; i++)  {    /* just do something to     */
          sum = 0;                      /* kill CPU cycles          */
          for (j = 0; j <= MAX_j; j++)
               sum += j;
     }
     printf("Computation is done.\n\n");
}