我创建了一个可以使用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);
}
}
答案 0 :(得分:3)
撤消对epoll_ctl
和timerfd_create
的来电顺序。现在,您正在为事件集添加一些随机整数值。
有几点:
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)
的值处理错误条件 - 每次调用的手册页都会为您提供可能的错误值。您确实需要围绕epoll_wait(2)
(或select(2)
。或poll(2)
)进行循环,但您需要:
希望这有帮助。