私は、指定された2時間の間にあるかどうかを確認し、そうである場合は入力を無効にするカーネルモジュールを作成しています。これは私が早く寝るようにしたいという私に関係しています。 (cronなどを含むさまざまな手法を使用できることは知っていますが、カーネルプログラミングを学びたいと思っていました...)
したがって、最初のバージョンとして、現在の時間が開始と終了の間にあるかどうかを確認します。これは、パラメーターを介してモジュールに設定されます。
したがって、私の質問は次のとおりです。現在の時間を取得するにはどうすればよいですか。カーネル空間にいるので、標準ライブラリの通常の時間関数にアクセスできません。これにはdo_gettimeofday()を使用する必要があると思いますが、これにより秒とナノ秒しか得られず、当日の時間数が必要になります。
ありがとう。
time_to_tm 関数を使用すると、構造 tm が返されます。タイムゾーンは変数 sys_tz で使用可能で、オフセットを適切に設定して現地時間を取得するのに役立ちます。
カーネルの現地時間を取得するには、以下のコードスニペットをカーネルドライバーに追加します。
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);
これは私にとってうまくいきます:
#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);
クロックのタイプとしてCLOCK_REALTIMEを指定して、clock_gettime関数を使用できます。
リファレンス http://linux.die.net/man/3/clock_gettime
Strace on date実行可能ファイルを実行するだけで、現在の日付をカーネルモードで取得することができます。