为什么无限期地等待 - timerfd_create?我哪里出错了?

时间:2011-05-20 10:27:53

标签: c linux timer

我创建了一个可以使用timerfd_create在5秒内过期的计时器,但我可以看到它无限期地等待。

有人可以帮助我吗?

提前致谢。

这是我的代码:

enter code here
#include <sys/timerfd.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <time.h>

int main()
{
  struct itimerspec its;
  struct epoll_event event, revent;

  int timer_fd, efd;

  /* Setting timer interval */
  its.it_interval.tv_sec=1;
  its.it_interval.tv_nsec=0;

  /* Setting timer expiration */
  its.it_value.tv_sec=5;
  its.it_value.tv_nsec=0;

  efd=epoll_create(2);
  event.data.fd=timer_fd;

  event.events=EPOLLIN;
  epoll_ctl(efd, EPOLL_CTL_ADD, timer_fd, &event);

  timer_fd=timerfd_create(CLOCK_REALTIME, 0);

  if(timer_fd==-1)
  {
    perror("timerfd:");
  }

  if(timerfd_settime(timer_fd, TFD_TIMER_ABSTIME, &its, NULL)==-1)
  {
   perror("timerfd_settime error:");
  }

  printf("Starting the timer...");

  while(1) {
     epoll_wait(efd, &revent, 1, -1);
  }
}

1 个答案:

答案 0 :(得分:3)

撤消对epoll_ctltimerfd_create的来电顺序。现在,您正在为事件集添加一些随机整数值。

编辑0:

有几点:

  • timerfd_create(2)生成文件描述符,就像open(2)socket(2)一样。您必须在之前将返回值分配给timer_fd变量,并将其赋予epoll_ctl(2),否则它只是堆栈中的随机整数值。
  • 不要使用TFD_TIMER_ABSTIME - 你要求内核启动一个在Epoch之后一秒钟到期的计时器(这不是那么大的交易 - 它会立即过期)
  • 当计时器到期时epoll_wait(2)返回示例中的就绪文件描述符数1,并且您应该处理它。另一方面,你只是忽略了返回值并在紧密循环中旋转,所以你甚至不知道计时器到期。
  • 您需要从计时器文件描述符中读取以消耗到期事件。否则,对epoll_wait(2)的所有后续调用将立即返回,因为描述符仍处于“已发信号”状态。
  • 始终检查系统调用的返回值并根据errno(3)的值处理错误条件 - 每次调用的手册页都会为您提供可能的错误值。

编辑1:

您确实需要围绕epoll_wait(2)(或select(2)。或poll(2))进行循环,但您需要:

  1. 处理正在发出信号的IO事件(这是这些多路复用API的重点 - 能够等待多个描述符并分派事件),并且
  2. 能够突破该循环(在信号上,在来自专用文件描述符ala self-pipe trick的输入上,或在某些应用程序事件上)。
  3. 希望这有帮助。