#include #include #include #include #include "lceb.h" int sigint_received=0; static void stopall(signum) int signum; { printf("SIGNAL %d RECEIVED: aborting eval\n", signum); sigint_received=1; } int stopped() { return sigint_received; } void set_intr() { struct sigaction sig; sig.sa_handler = stopall; sigemptyset(&sig.sa_mask); sig.sa_flags = 0; sigaction(SIGINT, &sig, NULL); sigaction(SIGALRM, &sig, NULL); # ifdef DEBUG printf("SIGINT armed.\n"); # endif } void set_alarm(ms) int ms; { struct sigaction sa; struct itimerval timer; /* Install timer_handler as the signal handler for SIGVTALRM. */ memset (&sa, 0, sizeof (sa)); sa.sa_handler = stopall; sigaction (SIGUSR1, &sa, NULL); timer.it_value.tv_sec = ms/1000; timer.it_value.tv_usec = (ms%1000)*1000; # ifdef DEBUG printf("alarm clock set to %.2f secs.\n", timer.it_value.tv_sec + timer.it_value.tv_usec / 1000000.); # endif /* ... and every 250 msec after that. */ timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 0; /* Start a virtual timer. It counts down whenever this process is executing. */ setitimer (ITIMER_REAL, &timer, NULL); }