59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <sys/time.h>
|
|
#include <string.h>
|
|
#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);
|
|
|
|
}
|