web-dev-qa-db-ja.com

Linuxカーネルスペースで現在の時間(時刻)を取得する方法

私は、指定された2時間の間にあるかどうかを確認し、そうである場合は入力を無効にするカーネルモジュールを作成しています。これは私が早く寝るようにしたいという私に関係しています。 (cronなどを含むさまざまな手法を使用できることは知っていますが、カーネルプログラミングを学びたいと思っていました...)

したがって、最初のバージョンとして、現在の時間が開始と終了の間にあるかどうかを確認します。これは、パラメーターを介してモジュールに設定されます。

したがって、私の質問は次のとおりです。現在の時間を取得するにはどうすればよいですか。カーネル空間にいるので、標準ライブラリの通常の時間関数にアクセスできません。これにはdo_gettimeofday()を使用する必要があると思いますが、これにより秒とナノ秒しか得られず、当日の時間数が必要になります。

ありがとう。

21
Tom Macdonald

time_to_tm 関数を使用すると、構造 tm が返されます。タイムゾーンは変数 sys_tz で使用可能で、オフセットを適切に設定して現地時間を取得するのに役立ちます。

15
Zimbabao

カーネルの現地時間を取得するには、以下のコードスニペットをカーネルドライバーに追加します。

struct timeval time;
unsigned long local_time;

do_gettimeofday(&time);
local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
rtc_time_to_tm(local_time, &tm);

printk(" @ (%04d-%02d-%02d %02d:%02d:%02d)\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
6
Bharath

これは私にとってうまくいきます:

#include <linux/time.h>
...
/* getnstimeofday - Returns the time of day in a timespec */
void getnstimeofday(struct timespec *ts)

通常の時刻形式を取得するには、以下を使用できます。

printk("TIME: %.2lu:%.2lu:%.2lu:%.6lu \r\n",
                   (curr_tm.tv_sec / 3600) % (24),
                   (curr_tm.tv_sec / 60) % (60),
                   curr_tm.tv_sec % 60,
                   curr_tm.tv_nsec / 1000);
2
Roman

クロックのタイプとしてCLOCK_REALTIMEを指定して、clock_gettime関数を使用できます。

リファレンス http://linux.die.net/man/3/clock_gettime

Strace on date実行可能ファイルを実行するだけで、現在の日付をカーネルモードで取得することができます。

0
sunmoon