it-swarm.com.ru

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

Я пишу модуль ядра, который проверяет, находится ли время между двумя указанными часами, и отключает ввод, если он есть. Это связано со мной, желающим убедиться, что я ложусь спать рано. (Я знаю, что мог бы также использовать любое количество различных техник, включая 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);
1
Roman

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

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

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

0
sunmoon