如何在Linux中检测系统时间的变化? [英] How to detect change of system time in 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.
推荐答案
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\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;
}
这篇关于如何在Linux中检测系统时间的变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!