繁体   English   中英

如何检测Linux中系统时间的变化?

[英]How to detect change of system time in Linux?

有没有办法在时间服务器更新系统时间或由于 DST 更改时收到通知? 我正在使用 API/系统调用或等效方法。

我努力将类似于 SQL NOW() 的值的生成优化为小时粒度,而不使用 SQL。

您可以使用timerfd_create(2)创建一个计时器,然后在设置时使用TFD_TIMER_CANCEL_ON_SET选项标记它。 将它设置为未来一个难以置信的时间,然后阻止它(使用轮询/选择等) - 如果系统时间发生变化,则计时器将被取消,您可以检测到。

(这就是systemd 的做法

例如:

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

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

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

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

因此,您会收到通知的唯一时间是在不寻常的操作之后。

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

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

暂无
暂无

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

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