繁体   English   中英

如何比较C中的两个时间戳?

[英]How do I compare two timestamps in C?

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

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

我该怎么办?

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)

谷歌搜索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;
 }

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

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

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;
}

为了查看时间,我只是掀起了这个。 它返回一个timeval作为字符串,您可以打印或发送到文本文件:

char *tv2str(struct timeval *intv) {
  static char ans[200];
  snprintf(ans,200,"%u.%u",(unsigned int)intv->tv_sec, \
    (unsigned int) intv->tv_usec);
  return ans;
}

使用如下:

printf("nowtv: %s\n",tv2str(&nowtv));

nowtv:1568407554.646623

Timercmp()似乎没有正常工作所以我想通过实际查看一些值来检查它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM