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

Ϲοδ*_*διϲ 5 c++ linux timezone ntp dst

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

我的工作之一是在不使用SQL的情况下,将类似于SQL NOW()的值的生成优化为一个小时的粒度。

Ben*_*Ben 6

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)