我在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,但我仍然得到几乎相同的内容,但两者之间有很大的不同,我做错了什么?
解决方法:
检查功能结果.
代码具有意外的输出,但是缺少简单的检查来确定设置的时间是否有效@Steve Summit.我希望这是早期的调试步骤.
// clock_settime(CLOCK_REALTIME,&SysTime_Test);
if (clock_settime(CLOCK_REALTIME,&SysTime_Test)) {
puts("Fail Set");
}
使用正确的* printf()说明符
成员tv_nsec很长.用“%ld”打印. @Antti Haapala
printf("%ld", SysTime_Test.tv_nsec);
tv_sec是一个time_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中的值出现意外,因为它们没有正确打印.
标签:timer,c-3,linux,time 来源: https://codeday.me/bug/20191110/2015901.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。