没有信号处理程序的POSIX定时器的目的是什么?
What's the purpose of a POSIX timer with no signal handler?
void EventProviderLinux::waitForEvents (EventLoopTime wait_time)
{
AIPSTACK_ASSERT(m_cur_epoll_event == m_num_epoll_events);
namespace chrono = std::chrono;
using Period = EventLoopTime::period;
using Rep = EventLoopTime::rep;
using SecType = decltype(itimerspec().it_value.tv_sec);
using NsecType = decltype(itimerspec().it_value.tv_nsec);
using NsecDuration = chrono::duration<NsecType, std::nano>;
static_assert(Period::num == 1);
static_assert(Period::den <= std::nano::den);
static_assert(std::is_signed_v<Rep>);
static_assert(std::is_signed_v<SecType>);
static_assert(TypeMax<Rep> / Period::den <= TypeMax<SecType>);
static_assert(TypeMin<Rep> / Period::den >= TypeMin<SecType> + 1);
if (wait_time != m_timerfd_time || m_force_timerfd_update) {
m_force_timerfd_update = true;
EventLoopTime::duration time_dur = wait_time.time_since_epoch();
SecType sec = time_dur.count() / Period::den;
Rep subsec = time_dur.count() % Period::den;
if (subsec < 0) {
sec--;
subsec += Period::den;
}
struct itimerspec itspec = {};
itspec.it_value.tv_sec = sec;
itspec.it_value.tv_nsec =
chrono::duration_cast<NsecDuration>(EventLoopTime::duration(subsec)).count();
// Prevent accidentally disarming the timerfd.
if (itspec.it_value.tv_sec == 0 && itspec.it_value.tv_nsec == 0) {
itspec.it_value.tv_nsec = 1;
}
if (::timerfd_settime(*m_timer_fd, TFD_TIMER_ABSTIME, &itspec, nullptr) < 0) {
throw std::runtime_error(formatString(
"EventProviderLinux: timerfd_settime failed, err=%d", errno));
}
m_timerfd_time = wait_time;
m_force_timerfd_update = false;
}
int wait_res;
while (true) {
wait_res = ::epoll_wait(*m_epoll_fd, m_epoll_events, MaxEpollEvents, -1);
if (AIPSTACK_LIKELY(wait_res >= 0)) {
break;
}
int err = errno;
if (err != EINTR) {
throw std::runtime_error(formatString(
"EventProviderLinux: epoll_wait failed, err=%d", err));
}
}
AIPSTACK_ASSERT(wait_res <= MaxEpollEvents);
m_cur_epoll_event = 0;
m_num_epoll_events = wait_res;
}
这个函数应该阻塞,直到m_epoll_fd
上有事件。您可以看到有一个计时器m_timer_fd
已创建,但从未赋予处理器。在没有处理程序的情况下启动计时器有什么意义?
另外,我在其他任何地方都没有看到这个计时器的任何用法。由于它是在本地创建的,因此在其类中没有用法。它必须具有本地用法。
函数取自此处
从timerfd_create手册页(强调我的(:
这些系统调用创建并操作提供计时器的计时器 通过文件描述符发出过期通知。 它们提供了一个 替代使用setitimer(2(或timer_create(2(,与 优点是文件描述符可以通过 select(2( 进行监控, 投票(2(和电子投票(7(。
从原始源代码:
control_epoll(EPOLL_CTL_ADD, *m_timer_fd, EPOLLIN, &m_timer_fd);
从上面我们可以看到计时器事件已设置为通过epoll
.
相关文章:
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 将此私有删除器函数包装在结构中的目的是什么?
- 没有信号处理程序的POSIX定时器的目的是什么?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 什么是迭代器
- 在 C++17 中实现迭代器和const_iterator的正确方法是什么?
- 只显示片段着色器的最佳方式是什么
- 在 ECS 模型中,最合适的观察器容器是什么?
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 对于 C 和 C++ 中的嵌入式编程,计时器类中的计数是什么意思?
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- 在下面的 C++ 代码中,*(迭代器)和 *(++迭代器)是什么意思?
- 对于大型C++项目,建议的 Eclipse CDT 配置是什么(索引器需要很长时间)
- 为什么我应该使用SetTimer功能,而不是多媒体定时器服务的应用程序不需要高分辨率定时