2017-10-06 23 views
2

我有一个非常简单的代码运行在Linux上,如下图所示:clock_gettime返回一些非常大的价值

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,我仍然有几乎相同的事情,有一个大跳之间,我有什么做错了?

+0

什么'clock_settime'返回?! –

+0

此外,这是**整个**程序?你是否包含'stdio.h'?你是否得到了关于'printf'错误参数的警告,你是否正确地编译了程序? –

+0

I.e.这*不是* [mcve] –

回答

1

检查功能的结果。

代码有意想不到的输出,但缺乏一个简单的检查,看看设置时间工作@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。在Linux系统上,必须是一些整数类型@Andrew Henle。投射到最宽(或至少很宽)的类型并打印。

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

节省时间

打开所有的编译器警告检测问题更快。

要清楚

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

1

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

两个tv_sectv_nsec计算机上64位,但该类型定义是signed long int小号的别名,因此它们应该使用%ld被显示出来!在您的计算机上,这些可能会作为32位值压入堆栈/寄存器,但是在printf中将检索到两个64位值:第一个将由tv_nsec/tv_sec和指向格式字符串的指针的第二个字节组成,存储的指令指针/函数返回地址。

更好的解决方案,因为我们是在POSIX,是铸造同时添加到,例如:

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

按照[POSIX标准](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html)的说法,'tv_sec'是'time_t'。只有'tv_nsec'是'[signed] long [int]'。 'time_t'只能是[“整数类型”](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html)。尽管如此,这足以打破一切。 UB是UB。 –

+0

@AndrewHenle是的我的意思是typedefs定义为'long int's。 –