我正在使用timerfd 实现一个计时器。这是一个相对计时器,我只需要按照设置的速率永远重复。我想对这个事件进行轮询,最初尝试使用轮询。当我这样做时,我会第一次看到计时器事件,然后就再也看不到了。但是,当我更改为使用 epoll(timerfd 的设置方式完全没有改变)时,它按预期工作。
这是带有轮询的代码:
#include <sys/timerfd.h>
#include <sys/poll.h>
#include <sys/epoll.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
int main(int ac, char *av[])
{
struct pollfd p;
int timerfd;
struct itimerspec timerValue;
/* clear pollfd */
bzero(&p, sizeof(p));
/* set timerfd */
timerfd = timerfd_create(CLOCK_REALTIME, 0);
if (timerfd < 0) {
printf("failed to create timer fd\n");
exit(1);
}
bzero(&timerValue, sizeof(timerValue));
timerValue.it_value.tv_sec = 1;
timerValue.it_value.tv_nsec = 0;
timerValue.it_interval.tv_sec = 1;
timerValue.it_interval.tv_nsec = 0;
/* set events */
p.fd = timerfd; …Run Code Online (Sandbox Code Playgroud)