timespec和timeval是POSIX的精度秒以下的时间类型,前者精确到纳秒,后者精确到微秒。定义如下:
- struct timespec {
- __kernel_time_t tv_sec; /* seconds */
-
long tv_nsec; /* nanoseconds */
-
};
-
struct timeval {
- __kernel_time_t tv_sec; /* seconds */
- __kernel_suseconds_t tv_usec; /* microseconds */
- }
当时我要取当前时间0.5秒后的时间,就想当然的给timeval.tv_usec加上了500000。还算了以下整形的表示范围,确定这样做不会导致溢出。可是调试时发现这个时间点怎么都等不来,哪怕是1秒、2秒、3秒后。
问题在于,给timeval.tv_usec加上5*10^5之后,确实没有超出整形的表示范围。但是!tv_usec的范围也仅仅是10^6,这样做tv_usec的值就可能超出10^6。得到的这个时间就是无效的…所以,安全的办法是:
- struct timeval tv;
-
tv.tv_usec += 500000;
-
if (tv.tv_usec >= 1000000)
-
{
-
tv.tv_sec += tv.tv_usec / 1000000;
-
tv.tv_usec %= 1000000;
- }
p.s原文地址:, 欢迎访问纯爷们的小生活