假设我的程序在Linux机器上运行,该机器已正确配置为处理闰秒.如何完成配置(NTP,配置文件)应与此问题无关.
实际上,内核将在月末插入额外的秒或跳过一秒钟.这对gettimeofday(2)读取的时间值有影响.重复或跳过该月的最后一个UTC秒.这里列出了闰秒期间的示例读数.
我的问题:如何在C/C++程序中找出闰秒是否会在月末发生,以及在哪个方向发生.那么如何在linux上实现以下功能呢
int leap_seconds_scheduled_for_end_of_month() {
if (/*kernel_will_insert_extra_second?*/)
return 1;
if (/*kernel_will_skip_over_last_second?*/)
return -1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果月末很远,结果是不正确的,这是可以的.(远远地,为了我的目的,是> = 2秒)答案必须是正确的(*)在可能的闰秒之前的最后一秒,即在该月的最后一天的23:59:58 UTC.如果我在发生闰秒后了解闰秒是不够的,因为我必须提前做好准备.
我一直试图在sysfs或procfs中找到任何闰秒指标,但到目前为止都没有成功.
(*)当然,如果内核本身在它发生之前只知道闰秒的一小部分,例如由于整个上个月中NTP服务的中断,那么答案就不正确了.没关系.
内核保留一个标志,用于定义是否在当前(UTC)日结束时添加(或删除)闰秒.如果支持,则在闰秒剩余不到一天时由ntpd设置.
因此,通过检查此标志,您基本上可以得到一天的闰秒警告,假设(a)您的ntp守护程序从其来源获得通知,并且(b)您的ntp守护程序正确地确定您的内核支持此.
我不认为该标志是通过sysfs或procfs公开的; 但是很容易通过adjtimex系统调用从C中检索:
#include <sys/timex.h>
#include <stdio.h>
int main(int argc, char **argv)
{
struct timex buf;
int res;
buf.modes = 0;
res = adjtimex(&buf);
if(res < 0) {
perror("Error calling adjtimex");
return 1;
}
printf("clock status: %i\n", res);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果闰秒正在进行中,则结果为1或2,如adjtimex(2)所示:
成功时,adjtimex()返回时钟状态:
Run Code Online (Sandbox Code Playgroud)#define TIME_OK 0 /* clock synchronized */ #define TIME_INS 1 /* insert leap second */ #define TIME_DEL 2 /* delete leap second */ #define TIME_OOP 3 /* leap second in progress */ #define TIME_WAIT 4 /* leap second has occurred */ #define TIME_BAD 5 /* clock not synchronized */
| 归档时间: |
|
| 查看次数: |
3605 次 |
| 最近记录: |