/* ---------------------------------------------------------------- */ /* PROGRAM sig-4.c: */ /* This program illustrates the way of handling two signals, each */ /* which has its own signal handler. */ /* ---------------------------------------------------------------- */ #include #include #include #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"); }