Как узнать текущий час (время суток) в пространстве ядра Linux - PullRequest
21 голосов
/ 22 февраля 2011

Я пишу модуль ядра, который проверяет, находится ли время между двумя указанными часами, и отключает ввод, если он есть.Это связано со мной, желающим убедиться, что я ложусь спать рано.(Я знаю, что мог бы также использовать любое количество различных техник, включая cron и т. Д., Но я хотел изучить программирование ядра ...)

В качестве первой версии я поэтому проверяю, находится ли текущий час между началом и концом, которые устанавливаются через параметры для модуля.

Поэтому мой вопрос: как мне получить текущий час?У меня нет доступа к обычным функциям времени в стандартной библиотеке, потому что я нахожусь в пространстве ядра.Я предполагаю, что я должен использовать do_gettimeofday () для этого, но это дает мне только секунды и наносекунды, и мне нужны часы в текущем дне.

Спасибо.

Ответы [ 5 ]

15 голосов
/ 22 февраля 2011
Вам может помочь функция

time_to_tm , которая возвращает структуру tm .Часовой пояс доступен в переменной sys_tz , это может помочь вам правильно установить смещение для получения местного времени.

6 голосов
/ 13 мая 2014

Чтобы узнать местное время в ядре, добавьте приведенный ниже фрагмент кода вашего драйвера ядра:

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);
1 голос
/ 04 апреля 2013

Это хорошо работает для меня:

#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);
0 голосов
/ 22 февраля 2011

Мы можем использовать функцию clock_gettime с CLOCK_REALTIME в качестве типа часов.

Ссылка http://linux.die.net/man/3/clock_gettime

Простое выполнение исполняемого файла strace on date дает нам идею получить текущую дату врежим ядра.

0 голосов
/ 22 февраля 2011

Преобразовать результат do_gettimeofday в час довольно просто, поскольку он начинается в полночь по Гринвичу.

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

Затем настройте местный часовой пояс

...