getnstimeofday

时间:2018-09-18 13:55:15

标签: linux-kernel kernel

我正在实现一个内核模块,在其中我需要测量一些事件之间的时间。为此,我使用功能 getnstimeofday 来获取当前时间戳(以纳秒为单位)。然后,我正在计算两个事件之间的时间,例如:

nsecs_elapsed = t2 - t1;

但是,当纳秒计数器回绕(溢出并从零开始再次计数)时,计算不正确,在这种情况下,我得到的t2比t1小。如果是这种情况,我想通过以下方式计算经过的纳秒数:

nsecs_elapsed = (POSSIBLE MAX_VALUE_TV_NSEC - t1) + (++t2);

其中“ POSSIBLE_MAX_VALUE_TV_NSEC”应为函数 getnstimeofday 返回的最大可能值。

现在,此函数(即 getnstimeofday )将此信息填充到 struct timespec 变量的 tv.nsec 成员中(其地址必须为作为参数传递给函数 getnstimeofday )。 由于 tv.nsec 的类型为 long ,因此 long 变量的最大值可能是此函数返回的最大可能值,但是根据我的观察,事实并非如此。

从该函数(即 getnstimeofday )中,我总是以9位数的形式获得纳秒数,因此我认为该函数返回的最大值应该是 999999999 ,但我想对此进行确认。我在任何地方都找不到这样的信息,在查看内核的代码时,我仍然不清楚该函数是否返回了除 signed long 的最大值以外的最大可能值。

有人知道 getnstimeofday 的返回值是否由某个最大值定界吗? 还是您不知道该在哪里找到该信息?

1 个答案:

答案 0 :(得分:1)

函数getnstimeofday填充结构中的两个字段

  • tv_sec 的总秒数,
  • tv_nsec 剩下的纳秒时间

这两个字段总共不能溢出:tv_sec部分溢出需要数百年的时间。

由于每秒有10 ^ 9纳秒,因此tv_nsec字段的最大值为999999999。