Подтвердить что ты не робот

Как получить текущий час (время суток) в пространстве ядра Linux

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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);

Ответ 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);

Ответ 4

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

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

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

Ответ 5

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

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

Затем отрегулируйте свой часовой пояс