首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测Linux系统时间的变化?

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

Stack Overflow用户
提问于 2010-02-12 20:07:11
回答 3查看 4.4K关注 0票数 7

有没有办法在时间服务器或由于DST更改而更新系统时间时得到通知?我正在寻找一个API/系统调用或类似的东西。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-25 23:45:30

您可以使用timerfd_create(2)创建计时器,然后在设置时使用TFD_TIMER_CANCEL_ON_SET选项对其进行标记。将它设置为一个令人难以置信的未来时间,然后阻塞它(通过轮询/选择等)-如果系统时间改变,那么计时器将被取消,这是你可以检测到的。

(这里是how systemd does it)

例如:

代码语言:javascript
复制
#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;
}
票数 7
EN

Stack Overflow用户

发布于 2010-02-12 20:18:01

我不知道是否有办法在系统时间发生变化时得到通知,但是

  • 系统时间存储为协调世界时,因此不会因为DST更改而通知任何更改。
  • 如果我的记忆是正确的,NTP守护进程通常会通过更改速度来调整时钟,同样不会通知任何更改。

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

票数 4
EN

Stack Overflow用户

发布于 2010-02-12 20:17:40

在大多数最新的Linux系统上,clock_gettime的速度令人难以置信,而且通常也非常精确;您可以使用clock_getres来了解精度。但是对于小时级别的时间戳,gettimeofday可能更方便,因为它可以为您进行时区调整。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2251635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档