#include #include #include #include #include #include int main(int argc, char *argv[]) { int pipe, timerfd, epoll; struct epoll_event ev[2]; struct itimerspec it; int ret; assert(argc == 2); pipe = open(argv[1], O_RDONLY); assert(pipe >= 0); timerfd = timerfd_create(CLOCK_MONOTONIC, 0); assert(timerfd >= 0); it.it_value.tv_sec = 0; it.it_value.tv_nsec = 1; it.it_interval.tv_sec = 0; it.it_interval.tv_nsec = 50000; ret = timerfd_settime(timerfd, 0, &it, NULL); assert(ret == 0); epoll = epoll_create1(0); assert(epoll >= 0); ev[0].events = EPOLLIN; ev[0].data.fd = pipe; ret = epoll_ctl(epoll, EPOLL_CTL_ADD, pipe, &ev[0]); assert(ret == 0); ev[1].events = EPOLLIN; ev[1].data.fd = timerfd; ret = epoll_ctl(epoll, EPOLL_CTL_ADD, timerfd, &ev[1]); assert(ret == 0); printf("starting loop\n"); while (1) { struct epoll_event event; char buffer[8]; size_t size; ret = epoll_wait(epoll, &event, 1, -1); assert(ret == 1); if (event.data.fd == timerfd) size = 8; else size = 1; ret = read(event.data.fd, buffer, size); assert(ret == size); } }