Linux-检测系统时间的变化

问题描述 投票:3回答:3

当时间服务器中的系统时间有更新或由于夏令时更改时,是否有办法得到通知?我正在执行API /系统调用或等效操作。

这是我不使用SQL就将类似于SQL NOW()的值的生成优化为一个小时的粒度的工作的一部分。

c++ linux timezone dst ntp
3个回答
2
投票

您可以使用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;
}

4
投票

我不知道是否有办法通知系统时间更改,但是

  • 系统时间存储为UTC,因此永远不会由于DST更改而导致更改被通知。

  • 如果我的记忆正确,则NTP守护进程通常会通过更改其速度来调整时钟,同样也不会发生任何更改。

因此,只有在不常见的操作之后才会通知您。


1
投票

clock_gettime在最新的Linux系统上非常快,而且通常也非常精确。您可以使用clock_getres找出精度。但是对于小时级别的时间戳,gettimeofday可能会更方便,因为它可以为您进行时区调整。

只需调用适当的系统调用,并在每次需要时间戳时将其划分为几个小时;从NTP进行的所有其他时间调整,或者已经为您完成的任何工作。

© www.soinside.com 2019 - 2024. All rights reserved.