c/c++语言开发共享如何比较C中的两个时间戳?

我正在编写一个套接字程序来维护两个输入套接字的FIFO队列。 在决定要服务的队列时,程序从每个队列中提取最新的时间戳。

我需要一种可靠的方法来比较两个时间结构。 我尝试使用timercmp() ,但我的gcc版本不支持它,并且文档声明该函数不符合POSIX。

我该怎么办?

    谷歌搜索timeval给出了第一个结果 。 从那个页面:

    通常需要减去struct timeval或struct timespec类型的两个值。 这是最好的方法。 它甚至可以在某些特殊的操作系统上运行,其中tv_sec成员具有无符号类型。

      /* Subtract the `struct timeval' values X and Y, storing the result in RESULT. Return 1 if the difference is negative, otherwise 0. */ int timeval_subtract (result, x, y) struct timeval *result, *x, *y; { /* Perform the carry for the later subtraction by updating y. */ if (x->tv_usec < y->tv_usec) { int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; y->tv_usec -= 1000000 * nsec; y->tv_sec += nsec; } if (x->tv_usec - y->tv_usec > 1000000) { int nsec = (x->tv_usec - y->tv_usec) / 1000000; y->tv_usec += 1000000 * nsec; y->tv_sec -= nsec; } /* Compute the time remaining to wait. tv_usec is certainly positive. */ result->tv_sec = x->tv_sec - y->tv_sec; result->tv_usec = x->tv_usec - y->tv_usec; /* Return 1 if result is negative. */ return x->tv_sec < y->tv_sec; } 

    timercmp()只是libc中的一个宏(sys / time.h):

     # define timercmp(a, b, CMP)  (((a)->tv_sec == (b)->tv_sec) ?  ((a)->tv_usec CMP (b)->tv_usec) :  ((a)->tv_sec CMP (b)->tv_sec)) 

    如果你需要timersub()

     # define timersub(a, b, result)  do {  (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;  (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;  if ((result)->tv_usec < 0) {  --(result)->tv_sec;  (result)->tv_usec += 1000000;  }  } while (0) 

    这略有不同,但我认为清楚地说明了所涉及的逻辑。 我正在使用C语言编写一些MSP430代码,并且时间戳结构与timeval非常相似,但是使用nsecs而不是usecs。

    这段代码保持一切正面,因此无符号整数可以正常工作,并避免溢出(我认为)。 除了结果之外,它也不会修改传入的时间戳/时间。

    需要了解更多c/c++开发分享如何比较C中的两个时间戳?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

     typedef struct timestamp { int32_t secs; int32_t nsecs; } timestamp_t; int timestamp_sub(timestamp_t * x, timestamp_t * y, timestamp_t * result){ // returns 1 if difference is negative, 0 otherwise // result is the absolute value of the difference between x and y negative = 0; if( x->secs > y->secs ){ if( x->nsecs > y->nsecs ){ result->secs = x->secs - y->secs; result->nsecs = x->nsecs - y->nsecs; }else{ result->secs = x->secs - y->secs - 1; result->nsecs = (1000*1000*1000) - y->nsecs + x->nsecs; } }else{ if( x->secs == y->secs ){ result->secs = 0; if( x->nsecs > y->nsecs ){ result->nsecs = x->nsecs - y->nsecs; }else{ negative = 1; result->nsecs = y->nsecs - x->nsecs; } }else{ negative = 1; if( x->nsecs > y->nsecs ){ result->secs = y->secs - x->secs - 1; result->nsecs = (1000*1000*1000) - x->nsecs + y->nsecs; }else{ result->secs = y->secs - x->secs; result->nsecs = y->nsecs - x->nsecs; } } } return negative; } 

      以上就是c/c++开发分享如何比较C中的两个时间戳?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/980208.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐