Chinaunix首页 | 论坛 | 博客
  • 博客访问: 801879
  • 博文数量: 330
  • 博客积分: 9641
  • 博客等级: 中将
  • 技术积分: 3181
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
文章分类

全部博文(330)

文章存档

2012年(17)

2011年(135)

2010年(85)

2009年(57)

2008年(36)

我的朋友

分类: C/C++

2011-01-31 11:10:23

timespec和timeval是POSIX的精度秒以下的时间类型,前者精确到纳秒,后者精确到微秒。定义如下:

  1. struct timespec {
  2.     __kernel_time_t tv_sec; /* seconds */
  3.     long tv_nsec; /* nanoseconds */
  4. };
  5. struct timeval {
  6.     __kernel_time_t tv_sec; /* seconds */
  7.     __kernel_suseconds_t tv_usec; /* microseconds */
  8. }

当时我要取当前时间0.5秒后的时间,就想当然的给timeval.tv_usec加上了500000。还算了以下整形的表示范围,确定这样做不会导致溢出。可是调试时发现这个时间点怎么都等不来,哪怕是1秒、2秒、3秒后。

问题在于,给timeval.tv_usec加上5*10^5之后,确实没有超出整形的表示范围。但是!tv_usec的范围也仅仅是10^6,这样做tv_usec的值就可能超出10^6。得到的这个时间就是无效的…所以,安全的办法是:

  1. struct timeval tv;
  2. tv.tv_usec += 500000;
  3. if (tv.tv_usec >= 1000000)
  4. {
  5.     tv.tv_sec += tv.tv_usec / 1000000;
  6.     tv.tv_usec %= 1000000;
  7. }

p.s原文地址:, 欢迎访问纯爷们的小生活

阅读(1484) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~