clock_gettime返回一些非常大的值

时间:2017-10-06 10:47:39

标签: c linux time timer

我在linux上运行一个非常简单的代码,如下所示:

struct timespec SysTime_Test;
#define BILLION  1000000000L
SysTime_Test.tv_sec = 0;
SysTime_Test.tv_nsec = 0;
clock_settime(CLOCK_REALTIME,&SysTime_Test);
while(1) {
    printf("%d ",clock_gettime(CLOCK_REALTIME,&SysTime_Test));
    printf("%llu, %llu\n",SysTime_Test.tv_sec,  SysTime_Test.tv_nsec);
    fflush(stdout);
}

我期待着开始:

0 0, 0
相反,我得到了:

0 97508642543791, 13184898790915571716
0 152071907084879, 13184898790915571716
0 184202557433736, 13184898790915571716
0 214744069882703, 13184898790915571716
            ............
0 688307164049923, 13184898790915571716
0 715983933311791, 13184898790915571716
0 743664997540956, 13184898790915571716
0 770706111642868, 13184898790915571716
0 798223967114747, 13184898790915571716
0 825746117553923, 13184898790915571716
0 853263973025802, 13184898790915571716
0 881898519994901, 13184898790915571716
0 909098547886802, 13184898790915571716
0 936779612115967, 13184898790915571716
0 964138553797857, 13184898790915571716
0 992455273186978, 13184898790915571716
0 1019973128658857, 13184898790915571716
0 1048130934257989, 13184898790915571716
              .......... 
0 1318713873968989, 13184898790915571716
0 1346549557020846, 13184898790915571716
0 1374707362619978, 13184898790915571716
0 1402225218091857, 13184898790915571716
0 1430700851270967, 13184898790915571716
               ..........
0 2643470766924857, 13184898790915571716
0 2670988622396736, 13184898790915571716
0 2698828600415890, 13184898790915571716
0 2726187542097780, 13184898790915571716
0 2754027520116934, 13184898790915571716
0 2781704289378802, 13184898790915571716
0 2809544267397956, 13184898790915571716
0 2836903209079846, 13184898790915571716    (Big jump)
0 1434656352942746714, 13184898790915571716
0 1434694848734629725, 13184898790915571716
            ..................
0 1435769544041619659, 13184898790915571716
0 1435796907278268846, 13184898790915571716
0 1435824266219950736, 13184898790915571716

我尝试使用不同的时钟ID,但我仍然得到了几乎相同的东西,介于两者之间,我做错了什么?

2 个答案:

答案 0 :(得分:2)

检查功能结果。

代码有意外的输出,但缺少一个简单的检查,看看是否设置了时间@Steve Summit。我希望这是一个早期的调试步骤。

// clock_settime(CLOCK_REALTIME,&SysTime_Test);
if (clock_settime(CLOCK_REALTIME,&SysTime_Test)) {
  puts("Fail Set");
}

使用正确的*printf()说明符

会员tv_nseclong。使用"%ld"打印。 @Antti Haapala

printf("%ld", SysTime_Test.tv_nsec);

tv_sectime_t。在必须某些整数类型@Andrew Henle的Linux系统上。投射到最宽(或至少宽)类型并打印。

printf("%jd", (intmax_t) SysTime_Test.tv_sec);
 // or
printf("%lld", (long long) SysTime_Test.tv_sec);

节省时间

启用所有编译器警告以更快地检测问题。

明确

“clock_gettime返回一些非常大的值” - >并不是的。该函数每次都按预期返回0并打印。 SysTime_Test中的值显然是出乎意料的,因为它们打印不正确。

答案 1 :(得分:1)

同样,问题缺少Minimal, Complete, and Verifiable example,但从行为可以推断,提问者使用的是32位平台,而不使用正确的格式字符,因此导致未定义的行为。

my 计算机上的tv_sectv_nsec都是64位,但typedef是signed long int的别名,因此应使用{{%ld打印它们1}}!在您的计算机上,这些可能会在堆栈/寄存器上被推送为32位值,但在printf中将检索到两个64位值:第一个将由tv_nsec / tv_sec和第二个字节组成指向格式字符串的指针和存储的指令指针/函数返回地址。

更好的解决方案,就像我们在POSIX上一样,是为两者添加一个强制转换,例如:

printf("%lld", (long long)SysTime_Test.tv_sec);
printf("%lld", (long long)SysTime_Test.tv_nsec);