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

/* @r{This flag controls termination of the main loop.} */
volatile sig_atomic_t keep_going = 1;

/* @r{The signal handler just clears the flag and re-enables itself.} */
void
catch_alarm (int sig)
@{
  keep_going = 0;
  signal (sig, catch_alarm);
@}

void
do_stuff (void)
@{
  puts ("Doing stuff while waiting for alarm....");
@}

int
main (void)
@{
  /* @r{Establish a handler for SIGALRM signals.} */
  signal (SIGALRM, catch_alarm);

  /* @r{Set an alarm to go off in a little while.} */
  alarm (2);

  /* @r{Check the flag once in a while to see when to quit.} */
  while (keep_going)
    do_stuff ();

  return EXIT_SUCCESS;
@}
