【问题标题】:setitimer on linux rounding up?linux上的setitimer四舍五入?
【发布时间】:2011-07-28 09:06:40
【问题描述】:

当我在 Linux 2.6.26 系统 (Debian 5.0.5) 上使用 setitimer 设置一个短超时然后查询设置值(使用 getitimer 或另一个 setitimer)时,我得到一个更高的值比我设定的:

#include <sys/time.h>
#include <iostream>

int main() {
  struct itimerval wanted, got;

  wanted.it_value.tv_sec     = 0;
  wanted.it_value.tv_usec    = 7000;
  wanted.it_interval.tv_sec  = 0;
  wanted.it_interval.tv_usec = 0;

  setitimer(ITIMER_VIRTUAL, &wanted, NULL);
  getitimer(ITIMER_VIRTUAL, &got);

  std::cerr << "we said: " << wanted.it_value.tv_usec << "\n"
            << "linux set: " << got.it_value.tv_usec << std::endl;

  return 0;
}

返回:

we said: 7000
linux set: 12000

这是有问题的,因为我们使用一些计算后报告的剩余时间,而且它们也太大了。

这是一个已知问题吗? (谷歌搜索不起作用。)有人有好的解决方法吗?

【问题讨论】:

    标签: linux setitimer


    【解决方案1】:

    POSIX documentation of the setitimer function 中有一条注释

    实现可能会限制计时器值的粒度。对于每个间隔定时器,如果请求的定时器值需要比实现支持更细的粒度,则实际定时器值应向上舍入到下一个支持的值

    您系统中的粒度似乎高于 1000 微秒(似乎是 6000 微秒)并且计时器值向上取整。如果您需要这样的精度,那么计时器粒度就是问题所在。

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 2012-08-04
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多