首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的计时器不是周期性的,而是只超时一次?

为什么我的计时器不是周期性的,而是只超时一次?
EN

Stack Overflow用户
提问于 2014-09-12 16:44:04
回答 1查看 465关注 0票数 1

我已经使用POSIX timerfd函数创建了一个计时器。意图是,计时器应该是周期性的,并且计时器超时是从一个名为myFunc( )的单独函数中观察到的

我多次调用此函数,以便可以在等待5秒后定期观察计时器超时。

问题是,只要第一次在5秒后过期,下一次onwards...it就不会再次过期,也就是说,从第二次迭代开始没有观察到5秒的延迟。

谁能告诉我我错过了什么?

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>
#include <errno.h>
#include <dlfcn.h>
#include <assert.h>
#include <sys/mman.h>
#include <new>

#include <limits.h>
#include <sys/epoll.h>
#include <sys/timerfd.h>

using namespace std;

struct epoll_event event;
int timer_fd, efd, no_of_fd;
void myFunc( int i );

int main()
{
  struct itimerspec its;

  its.it_value.tv_sec = 5;
  its.it_value.tv_nsec = 0;

  its.it_interval.tv_sec = 3; // Every 3 seconds interval
  its.it_interval.tv_nsec = 0;


  efd = epoll_create(2);
  timer_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK);

  if ( timer_fd == -1 )
  {
    fprintf(stderr, "timerfd_create error in start timer");
    return 1;
  }

  event.data.fd = timer_fd;
  event.events = EPOLLIN|EPOLLPRI;

  if ( epoll_ctl(efd, EPOLL_CTL_ADD, timer_fd, &event) == -1 )
  {
     fprintf(stderr, "epoll_ctl error in start timer"); 
     return 1;
  }

  if ( timerfd_settime(timer_fd, 0, &its, NULL) == -1 )
  {
    fprintf(stderr, "timerfd_settime error in start timer");
    return 1;
  }
  myFunc( 10 );
  myFunc( 20 );
  myFunc( 30 );
}

void myFunc( int i )
{
  printf("Inside myFunc %d\n", i);
  no_of_fd = 0;
  struct epoll_event revent;
  errno = 0;
  do {
     no_of_fd = epoll_wait(efd, &revent, 1, -1);
  } while ( no_of_fd < 0 && errno == EINTR );

  if ( no_of_fd < 0 )
  {
    fprintf(stderr, "epoll_wait error in start timer");

  }

  if ( revent.data.fd == timer_fd ) {
     printf("Timer expired \n");    
  }

}
EN

Stack Overflow用户

发布于 2014-10-14 20:34:15

当使用具有电平触发的epoll时,应读取每个EPOLLIN上的8个字节。这是一个int64,它告诉您事件过期的次数。读取它可以有效地“清除”这个数字,以便下一个EPOLLIN是不同事件到期的结果。

这本手册告诉你如何阅读:

代码语言:javascript
复制
          If the timer has already expired one or more times since its
          settings were last modified using timerfd_settime(), or since
          the last successful read(2), then the buffer given to read(2)
          returns an unsigned 8-byte integer (uint64_t) containing the
          number of expirations that have occurred.  (The returned value
          is in host byte order—that is, the native byte order for
          integers on the host machine.)
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25804171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档