- expiring.it_interval.tv_sec=1;
- expiring.it_interval.tv_nsec=0;
- expiring.it_value.tv_sec=5;
- expiring.it_value.tv_nsec=0;
- if (timerfd_settime(fd, 0, expiring, NULL)) {
- perror("Cannot set timer");
+ expiring.it_interval.tv_sec=interval;
+ expiring.it_interval.tv_nsec=nsinter;
+ expiring.it_value.tv_sec=wait;
+ expiring.it_value.tv_nsec=nswait;
+ if (timerfd_settime(fd, 0, &expiring, NULL)) {
+ die("Cannot set timer");
+ }
+ printf("Timer interval %i sec, timer time %i sec\n", wait, interval);
+ pid = fork();
+ /* epoll setup */
+ if ((epfd=epoll_create(5)) < 0)
+ die("Failing on epoll_create");
+ epev.data.fd = fd;
+ epev.events = EPOLLIN;
+ if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &epev))
+ die("Failing in epoll_ctl");
+ /* main loop */
+ while (1) {
+ while (n=epoll_wait(epfd, events, MAX_EPOLL_EV, -1)) {
+ if (n < 0) {
+ if (errno != EAGAIN)
+ die("error on epoll_wait");
+ else
+ continue;
+ } else {
+ printf("Got %i events, pid %i, time %i\n", n, pid, time(NULL));
+ /* loop on epoll events */
+ for (i=0; i<n; i++) {
+ if (events[i].data.fd == fd) { // if timer expired
+ printf("Timer expired in pid %i:\n", pid);
+ while(nread=read(fd, &expired, sizeof(expired))) {
+ if (nread < 0) {
+ if (errno != EAGAIN)
+ die("signalfd read error");
+ else
+ break;
+ }
+ if (nread != sizeof(expired)) {
+ printf("Error on timer data read, '\n");
+ continue;
+ }
+ printf("Expired %llu times in pid %i\n",
+ expired, pid);
+ }
+ }
+ }
+ }
+ }