linux - 检测系统时间的变化

时间:2010-02-12 12:07:11

标签: c++ linux timezone dst ntp

当时间服务器或DST更改导致系统时间更新时,是否有办法获得通知?我正在进行API /系统调用或同等操作。

在不使用SQL的情况下优化生成类似于SQL NOW()的值的一部分或者我的努力,而不使用SQL。

3 个答案:

答案 0 :(得分:4)

我不知道是否有办法通知系统时间的变化,但

  • 系统时间以UTC格式存储,因此DST更改不会因为通知而发生变化。

  • 如果我的记忆是正确的,NTP守护程序通常会通过改变速度来调整时钟,再没有变化要通知。

因此,只有通知您才会收到通知。

答案 1 :(得分:4)

您可以使用timerfd_create(2)创建一个计时器,然后在设置时使用TFD_TIMER_CANCEL_ON_SET选项对其进行标记。将来将其设置为难以置信的时间,然后在其上进行阻塞(使用轮询/选择等)-如果系统时间更改,则计时器将被取消,您可以检测到。

(这是how systemd does it

例如:

#include <sys/timerfd.h>
#include <limits.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

int main(void) {
        int fd = timerfd_create(CLOCK_REALTIME, 0);
        timerfd_settime(fd, TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET,
                        &(struct itimerspec){ .it_value = { .tv_sec = INT_MAX } },
                        NULL);
        printf("Waiting\n");
        char buffer[10];
        if (-1 == read(fd, &buffer, 10)) {
                if (errno == ECANCELED)
                        printf("Timer cancelled - system clock changed\n");
                else
                        perror("error");
        }
        close(fd);
        return 0;
}

答案 2 :(得分:1)

在最新的Linux系统上,

clock_gettime速度非常快,通常也非常精确;你可以使用clock_getres找出精度。但对于小时级别的时间戳,gettimeofday可能更方便,因为它可以为您进行时区调整。

只需拨打适当的系统电话,并在每次需要时间戳时将分成几小时;来自NTP的所有其他时间调整或已经为您完成的任何事情。