22

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

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

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

ありがとう。

4

5 に答える 5

16

time_to_tm関数は、構造体tmを返すのに役立ちます。変数sys_tzで利用可能なタイムゾーン。これは、現地時間を取得するためにオフセットを適切に設定するのに役立ちます。

于 2011-02-22T11:24:13.370 に答える
7

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

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);
于 2014-05-13T07:29:10.717 に答える
3

これは私にとってうまく機能します:

#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);
于 2013-04-04T08:40:27.887 に答える
-1

do_gettimeofdayの結果を1時間に変換するのは、グリニッジ標準時の午前0時に開始されるため、非常に簡単です。

time_t t = time(0);
time_t SecondsOfDay = t % (24*60*60);
time_t HourGMT = SecondsOfDay / (60*60);

次に、ローカルタイムゾーンに合わせて調整します

于 2011-02-22T11:24:35.017 に答える
-1

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

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

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

于 2011-02-22T11:44:15.263 に答える