web-dev-qa-db-ja.com

CLOCK_MONOTONICの開始点

Linuxで理解しているように、CLOCK_MONOTONICの開始点はブート時間です。現在の作業では、CLOCK_REALTIME(計算用)の代わりに単調時計を使用することを好みますが、同時に、レポートで人間に優しいタイムスタンプ(年/月/日)を提供する必要があります。それらはあまり正確ではない可能性があるため、起動時間とともに単調カウンタに参加することを考えていました。

LinuxシステムでAPI呼び出しを使用してこの時間を取得できる場所はどこですか?

18
rimas

Linuxカーネルがuptimeカウンターを開始すると同時に、単調な時計の追跡を開始すると仮定すると、(エポックと比較して)ブート時間を差し引くと、 ptime現在の時刻から。

Linuxは sysinfo 構造を介してシステムuptimeを秒単位で提供します。エポックは time 関数を介してPOSIX準拠ライブラリで取得できるため、現在の時間(秒単位)。

#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <sys/sysinfo.h>

int main(void){
    /* get uptime in seconds */
    struct sysinfo info;
    sysinfo(&info);

    /* calculate boot time in seconds since the Epoch */
    const time_t boottime = time(NULL) - info.uptime;

    /* get monotonic clock time */
    struct timespec monotime;
    clock_gettime(CLOCK_MONOTONIC, &monotime);

    /* calculate current time in seconds since the Epoch */
    time_t curtime = boottime + monotime.tv_sec;

    /* get realtime clock time for comparison */
    struct timespec realtime;
    clock_gettime(CLOCK_REALTIME, &realtime);

    printf("Boot time = %s", ctime(&boottime));
    printf("Current time = %s", ctime(&curtime));
    printf("Real Time = %s", ctime(&realtime.tv_sec));

    return 0;
}

残念ながら、単調時計は起動時間と正確に一致しない場合があります。上記のコードを自分のマシンでテストしたところ、単調クロックはシステムの稼働時間から1秒ずれていました。ただし、それぞれのオフセットを考慮する限り、単調クロックを使用できます。

移植性に関する注意:Linuxはブート時間に対して現在の単調な時間を返す場合がありますが、POSIXマシンは一般に現在の時間を返すことができます任意の時点からの単調な時間-しかし一貫性のある時点 多くの場合エポック)


補足として、私が行ったようにブート時間を導き出す必要はないかもしれません。人間が読める形式で起動時間を表示する多くのLinuxユーティリティがあるため、Linux APIを介して起動時間を取得する方法があると思います。例えば:

$ who -b
         system boot  2013-06-21 12:56

私はそのような呼び出しを見つけることができませんでしたが、これらの一般的なユーティリティのいくつかのソースコードを調べると、人間が読める起動時間を決定する方法が明らかになる場合があります。

whoユーティリティの場合、システムの起動時間を取得するために---(utmp ファイルを利用していると思います。

11
Vilhelm Gray

http://www.kernel.org/doc/man-pages/online/pages/man2/clock_getres.2.html

  CLOCK_MONOTONIC
          Clock that cannot be set and represents monotonic time since some
          unspecified starting point.

間隔の計算やその他の目的でCLOCK_MONOTONICを使用できますが、実際に人間が読める形式に変換することはできません。

さらに、おそらくCLOCK_MONOTONIC_RAWの代わりにCLOCK_MONOTONICが必要でしょう。

  CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific)
          Similar  to  CLOCK_MONOTONIC, but provides access to a raw hard‐
          ware-based time that is not subject to NTP adjustments.

人間が読める時間のためにCLOCK_REALTIMEを使い続けてください。

3

CLOCK_MONOTONICは通常、システム時刻の調整による影響を受けません。たとえば、システムクロックがNTPを介して調整されている場合、CLOCK_MONOTONICは知る方法がありません(必要もありません)。

このため、人間が読み取れるタイムスタンプが必要な場合は、CLOCK_MONOTONICを使用しないでください。

説明については、 CLOCK_REALTIMEとCLOCK_MONOTONICの違い? を参照してください。

0
NPE