kqueue changed
[eleutheria.git] / kqueue / kqtimer.c
blobff7c52704f759bec7eabe38600fc1b338fe598b9
1 /*
2 * Compile with:
3 * gcc kqtimer.c -o kqtimer -Wall -W -Wextra -ansi -pedantic
5 * The following code will setup a timer that will trigger a
6 * kevent every 5 seconds. Once it does, the process will fork
7 * and the child will execute the date(1) command.
8 */
10 #include <sys/event.h>
11 #include <sys/time.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h> /* for strerror() */
15 #include <unistd.h>
17 /* Function prototypes */
18 void diep(const char *s);
20 int main(void)
22 struct kevent change; /* event we want to monitor */
23 struct kevent event; /* event that was triggered */
24 pid_t pid;
25 int kq, nev;
27 /* Create a new kernel event queue */
28 if ((kq = kqueue()) == -1)
29 diep("kqueue()");
31 /* Initalise kevent structure */
32 EV_SET(&change, 1, EVFILT_TIMER, EV_ADD | EV_ENABLE, 0, 5000, 0);
34 /* Loop forever */
35 for (;;) {
36 nev = kevent(kq, &change, 1, &event, 1, NULL);
38 if (nev < 0)
39 diep("kevent()");
41 else if (nev > 0) {
42 if (event.flags & EV_ERROR) { /* report any error */
43 fprintf(stderr, "EV_ERROR: %s\n", strerror(event.data));
44 exit(EXIT_FAILURE);
47 if ((pid = fork()) < 0) /* fork error */
48 diep("fork()");
50 else if (pid == 0) /* child */
51 if (execlp("date", "date", (char *)0) < 0)
52 diep("execlp()");
56 close(kq);
57 return EXIT_SUCCESS;
60 void diep(const char *s)
62 perror(s);
63 exit(EXIT_FAILURE);