This commit is contained in:
2021-01-27 16:00:05 +01:00
parent 3da1891778
commit 80bd319a6d

74
timer.c
View File

@@ -1,11 +1,68 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <unistd.h>
#include <signal.h>
#include <sys/time.h>
#include <string.h>
#include "lceb.h" #include "lceb.h"
int sigint_received=0;
int displaytimer=0; int displaytimer=0;
static struct timespec start; static struct timespec start;
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(SIGUSR1, &sig, NULL);
# ifdef DEBUG
printf("SIGINT armed.\n");
# endif
}
void set_alarm(ms)
int ms;
{
struct sigaction sig;
struct itimerval timer;
/* Install timer_handler as the signal handler for SIGVTALRM. */
//memset (&sa, 0, sizeof (sa));
sig.sa_handler = stopall;
sigemptyset(&sig.sa_mask);
sig.sa_flags = 0;
sigaction (SIGALRM, &sig, 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);
}
void start_timer() void start_timer()
{ {
printf("timer started...\n"); printf("timer started...\n");
@@ -29,7 +86,6 @@ double get_timer(timer)
struct timespec timer; struct timespec timer;
{ {
double diff; double diff;
diff=(timer.tv_sec - start.tv_sec) + (timer.tv_nsec - start.tv_nsec) / NANOSEC; diff=(timer.tv_sec - start.tv_sec) + (timer.tv_nsec - start.tv_nsec) / NANOSEC;
# ifdef DEBUG_TIMER # ifdef DEBUG_TIMER
printf("timer sec: %.5f\n", diff); printf("timer sec: %.5f\n", diff);
@@ -43,18 +99,20 @@ int main(ac, av)
char **av; char **av;
{ {
int delay; int delay;
struct timespec end, tsdelay; struct timespec end;
if (ac != 2) { if (ac != 2) {
fprintf(stderr, "usage: %s msecs\n", *av); fprintf(stderr, "usage: %s msecs\n", *av);
exit (1); exit (1);
} }
delay=atoi(*(av+1)); delay=atoi(*(av+1))*10;
start_timer(); start_timer();
tsdelay.tv_sec=delay/MILLISEC; set_intr();
tsdelay.tv_nsec=delay%MILLISEC; set_alarm(delay);
printf("delay %d=%ld:%ld\n", delay, tsdelay.tv_sec, tsdelay.tv_nsec); //tsdelay.tv_sec=delay/MILLISEC;
nanosleep(&tsdelay, NULL); //tsdelay.tv_nsec=delay%MILLISEC;
//printf("delay %d=%ld:%ld\n", delay, tsdelay.tv_sec, tsdelay.tv_nsec);
sleep(5);
set_timer(&end); set_timer(&end);
printf("Time elapsed: %.5f seconds\n", get_timer(end)); printf("Time elapsed: %.5f seconds\n", get_timer(end));