如何在 Linux 中检测系统时间的变化? [英] How to detect change of system time in Linux?

查看:105
本文介绍了如何在 Linux 中检测系统时间的变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法在从时间服务器更新系统时间或由于 DST 更改时收到通知?我在进行 API/系统调用或等效调用.

Is there a way to get notified when there is update to the system time from a time-server or due to DST change? I am after an API/system call or equivalent.

在不使用 SQL 的情况下,将类似于 SQL NOW() 的值的生成优化到小时粒度是我努力的一部分.

It is part of my effort to optimise generating a value for something similar to SQL NOW() to an hour granularity, without using SQL.

推荐答案

你可以使用timerfd_create(2) 创建一个定时器,然后在设置时用 TFD_TIMER_CANCEL_ON_SET 选项标记它.将其设置为将来不合理的时间,然后对其进行阻止(使用轮询/选择等)-如果系统时间发生更改,则计时器将被取消,您可以检测到.

You can use timerfd_create(2) to create a timer, then mark it with the TFD_TIMER_CANCEL_ON_SET option when setting it. Set it for an implausible time in the future and then block on it (with poll/select etc.) - if the system time changes then the timer will be cancelled, which you can detect.

(这是 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
");
        char buffer[10];
        if (-1 == read(fd, &buffer, 10)) {
                if (errno == ECANCELED)
                        printf("Timer cancelled - system clock changed
");
                else
                        perror("error");
        }
        close(fd);
        return 0;
}

这篇关于如何在 Linux 中检测系统时间的变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆