即使间隔设置为零,使用 timerfd_create() 和 timerfd_settime() 的计时器也会持续到期 [英] timer using timerfd_create() and timerfd_settime() continually expires even though interval is set to zero

查看:71
本文介绍了即使间隔设置为零,使用 timerfd_create() 和 timerfd_settime() 的计时器也会持续到期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是精简后的代码.计时器及时到期(由 epoll_wait 报告),但即使间隔设置为零,epoll_wait 仍会持续触发计时器 fd 的就绪读取事件(EPOLLIN).不应该在间隔设置为 0 时只触发一次吗?

Here is the stripped-down code. The timer expires(reported by epoll_wait) in time but even though interval is set to zero, epoll_wait continually triggers a ready-to-read event (EPOLLIN) for the timer fd. Should it not be triggered just once as interval is set to 0?

timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC);
struct itimerspec *my_itimerspec_new, *my_itimerspec_old;
my_itimerspec_new = malloc(sizeof(struct itimerspec));
my_itimerspec_old = malloc(sizeof(struct itimerspec));

bzero(my_itimerspec_new, sizeof(struct itimerspec));
bzero(my_itimerspec_old, sizeof(struct itimerspec));


my_itimerspec_new->it_value.tv_sec  = 60;
my_itimerspec_new->it_value.tv_nsec = 0; 
my_itimerspec_new->it_interval.tv_sec  = 0; 
my_itimerspec_new->it_interval.tv_nsec = 0; 

my_itimerspec_old->it_value.tv_sec  = 0; 
my_itimerspec_old->it_value.tv_nsec = 0; 
my_itimerspec_old->it_interval.tv_sec  = 0; 
my_itimerspec_old->it_interval.tv_nsec = 0; 

timerfd_settime(timerFd, 0, my_itimerspec_new, my_itimerspec_old);

推荐答案

epoll, poll(), select() 等会告诉您计时器描述符是否可以在不阻塞的情况下读取.它在计时器到期时变得可读,并且一直保持下去,直到您 read() 从中获得一个 64 位无符号整数,其中包含自上次读取以来计时器到期的次数.如果您不这样做,它会继续以可读方式进行轮询(模数,但是如果您使用这些选项,ET 和 ONESHOT 选项会影响行为)

epoll, poll(), select(), etc. will tell you if the timer descriptor is readable without blocking. It becomes readable when the timer expires and remains so until you read() a 64 bit unsigned integer from it that contains the count of times the timer expired since the last read. If you don't do that, it continues to poll as readable (modulo however ET and ONESHOT options affect the behavior if you're using those)

这篇关于即使间隔设置为零,使用 timerfd_create() 和 timerfd_settime() 的计时器也会持续到期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆