 <p>Instead of polling with epoll, since you're only waiting on one timer you can just check if it's expired by <code>read</code>ing it. The number of times it has expired will then be stored in the buffer that you're <code>read</code>ing into, or if it hasn't expired, the <code>read</code> will fail with the error EAGAIN.</p> <pre><code>// set up timer // ... uint64_t expirations; if ((read(timer_fd, &amp;expirations, sizeof(uint64_t))==-1) &amp;&amp; errno == EAGAIN) { printf("Timer has not expired yet.\n"); } else { printf("Timer has expired %llu times.\n", expirations); } </code></pre> <p>Note that you'll need to initialize <code>timer_fd</code> with the flag <code>TFD_NONBLOCK</code>, or else the <code>read</code> will block if it hasn't expired yet rather than fail, but you already do that.</p>