таймер с использованием timerfd_create () и timerfd_settime () постоянно истекает, даже если интервал установлен на ноль - PullRequest
0 голосов
/ 28 февраля 2020

Вот сокращенный код. Таймер истекает (сообщается epoll_wait) во времени, но даже если интервал установлен равным нулю, epoll_wait постоянно вызывает событие готовности к чтению (EPOLLIN) для таймера fd. Разве это не должно быть запущено только один раз, поскольку интервал установлен в 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);

1 Ответ

2 голосов
/ 29 февраля 2020

epoll, poll(), select() и др. c. скажет вам, если дескриптор таймера доступен для чтения без блокировки. Он становится читаемым, когда истекает время таймера, и остается таковым до тех пор, пока вы read() не получите от него 64-битное целое число без знака, которое содержит количество истечений таймера с момента последнего чтения. Если вы этого не сделаете, он продолжит опрос как читаемый (по модулю, однако параметры ET и ONESHOT влияют на поведение, если вы их используете)

...