gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:36 24 4
gpt4 key购买 nike

我使用 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);
}
}

最佳答案

颠倒调用 epoll_ctltimerfd_create 的顺序。现在您正在向事件集添加一些随机整数值。

编辑0:

几点:

  • timerfd_create(2)产生一个文件描述符,就像 open(2)socket(2) .您必须将返回值分配给 timer_fd 变量 before 将其赋给 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 的全部要点 - 能够等待多个描述符并分派(dispatch)事件),以及
  2. 能够跳出该循环(根据信号、来自专用文件描述符 ala self-pipe trick 的输入或某些应用程序事件)。

希望这对您有所帮助。

关于c - 为什么要无限期地等待 - timerfd_create?我哪里出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6070578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com