私が理解しているように、Linux の出発点CLOCK_MONOTONIC
は起動時間です。私の現在の仕事では、CLOCK_REALTIME
(計算のために)代わりに単調時計を使用することを好みますが、同時に、レポートで人間に優しいタイムスタンプ(年/月/日)を提供する必要があります。それらはあまり正確ではない可能性があるため、ブート時間で単調カウンターに参加することを考えていました。
API呼び出しを使用して、Linuxシステムでこの時間をどこから取得できますか?
Linux カーネルが単調クロックの追跡を開始すると同時にアップタイムカウンターを開始すると仮定すると、現在の時刻からアップタイムを差し引くことで、(エポックに関連する) ブート時間を導き出すことができます。
Linux は、構造を介して数秒でシステムのアップタイムを提供します。sysinfo
エポック以降の現在の時間(秒単位) は、関数を介して POSIX 準拠のライブラリで取得できますtime
。
#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
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
人間が読める時間だけ使い続けてください。
CLOCK_MONOTONIC
通常、システム時間の調整による影響はありません。たとえば、システム クロックが NTP を介して調整されている場合、 にCLOCK_MONOTONIC
は知る方法がありません (また、知る必要もありません)。
このため、CLOCK_MONOTONIC
人間が読めるタイムスタンプが必要な場合は使用しないでください。
CLOCK_REALTIME と CLOCK_MONOTONIC の違いを参照してください。議論のために。