赞
踩
本文摘自写给应用开发的 Android Framework 教程,完整教程请查阅 https://yuandaimaahao.github.io/AndroidFrameworkTutorialPages/
timerfd 是一个时间相关的 fd,当 timerfd 初始化时,可以设置一个超时时间,超时之后,该句柄可读,读出来的是超时的次数。
timerfd 使用起来比较简单,我们把他的用法过一遍即可:
timerfd 相关的系统调用有 3 个:
- // 创建一个 timerfd 句柄
- int timerfd_create(int clockid, int flags);
- // 启动或关闭 timerfd 对应的定时器
- int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
- // 获取指定 timerfd 距离下一次超时还剩的时间
- int timerfd_gettime(int fd, struct itimerspec *curr_value);
timerfd 常与 epoll 系统调用结合使用:
- // 创建一个 timerfd 句柄
- int fdTimer = timerfd_create(CLOCK_MONOTONIC, 0 /*flags*/);
-
- itimerspec timespec {
- // 设置超时间隔
- .it_interval = {
- .tv_sec = 5,
- .tv_nsec = 0,
- },
- //第一次超时时间
- .it_value = {
- .tv_sec = 5,
- .tv_nsec = 0,
- },
- };
-
- //启动定时器
- int timeRes = timerfd_settime(fdTimer, 0 /*flags*/, ×pec, nullptr);
-
- // epoll 监听 timerfd
- epoll_ctl(mEpollFd, EPOLL_CTL_Add, fdTimer, &eventItem);
-
-
- while (true)
- {
- // 进入休眠状态
- epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);
- if (count < 0)
- {
- perror("epoll failed");
- break;
- }
- for (int i=0;i < count;i++)
- {
- //处理计时器到达事件
- }
- }
Linux fd 系列 — 定时器 timerfd 是什么?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。