如何确定linux内核是否会在月底插入闰秒

Lud*_*lze 11 c linux time

假设我的程序在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服务的中断,那么答案就不正确了.没关系.

ric*_*vdh 5

内核保留一个标志,用于定义是否在当前(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()返回时钟状态:

#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 */
Run Code Online (Sandbox Code Playgroud)