aboutsummaryrefslogtreecommitdiff
path: root/sem3/osc/mm1/mm2/tprog.c
blob: 377555f91da6902f1562e45d8ab3df8018eee498 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>

#define STARTSEC 10
#define ENDUSEC 500000
#define SPEED 0.8

struct itimerval timer;

void timer_handler(int signum) {
    /* Handy structure reference */
    struct timeval *tv = &timer.it_value;
    printf("Hey we hit the alarm\n\a");

    /* Calculate new alarm */
    tv->tv_sec *= SPEED;
    if (tv->tv_sec == 0) {
	/* If tv_usec is 0 set i to 1 sec otherwise half it */
	if (tv->tv_usec == 0) {
	    tv->tv_usec = 999999;
	} else if (tv->tv_usec > ENDUSEC) {
	    tv->tv_usec *= SPEED;
	    if (tv->tv_usec < ENDUSEC) {
		tv->tv_usec = ENDUSEC;
	    }
	} else {
	    /* Return letting the timer be set to ENDUSEC */
	    return;
	}
    }

    printf("Set to %d and %d\n", timer.it_value.tv_sec, timer.it_value.tv_usec);
    /* Set alarm */
    int err = setitimer(ITIMER_REAL, &timer, NULL);
    if (err) {
	printf("Hey we got an error guys\n");
	exit(1);
    }
}

int main() {
    /* Setup handler for timer */
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa)); /* Remeber to set all fields to zero */

    sa.sa_handler = &timer_handler;
    sigaction(SIGALRM, &sa, NULL);

    /* Setup timer values */
    timer.it_value.tv_sec = STARTSEC;
    timer.it_value.tv_usec = 0;

    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = ENDUSEC;

    /* Start the timer */
    setitimer(ITIMER_REAL, &timer, NULL);

    /* Select signals */
    sigset_t sigset;
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGTERM);

    /* Wait for termination */
    sigwait(&sigset, NULL);

    return 0;
}