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

<p>я пишу модуль ядра, который проверяет, находится ли время между двумя указанными часами, и отключает ввод, если он есть. это связано со мной, желающим убедиться, что я ложусь спать рано. (я знаю, что мог бы также использовать любое количество различных техник, включая cron и т.д., но я хотел изучить программирование ядра ...)</p><p>поэтому в качестве первой версии я проверяю, находится ли текущий час между началом и концом, которые задаются с помощью параметров модуля.</p><p>поэтому мой вопрос: как мне получить текущий час? у меня нет доступа к обычным функциям времени в стандартной библиотеке, потому что я нахожусь в пространстве ядра. я предполагаю, что я должен использовать do\_gettimeofday () для этого, но это дает мне только секунды и наносекунды, и мне нужны часы в текущем дне.</p><p>благодарю.</p>

<p> <a href="http://lxr.free-electrons.com/source/include/linux/time.h?v=2.6.33#l163">time\_to\_tm</a> функция может быть вашей помощи, которая возвращает структуру <a href="http://lxr.free-electrons.com/source/kernel/time/timeconv.c?v=2.6.33#l77">tm</a> . часовой пояс доступен в переменной <a href="http://lxr.free-electrons.com/source/kernel/time.c?v=2.6.33#l51">sys\_tz</a> , это может помочь вам правильно установить смещение для получения местного времени.</p>

<p>чтобы узнать местное время в ядре, добавьте приведенный ниже фрагмент кода своего драйвера ядра:</p><pre><code>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); </code></pre>

<p>это хорошо работает для меня:</p><pre><code>#include <linux/time.h> ... /* getnstimeofday - returns the time of day in a timespec */ void getnstimeofday(struct timespec *ts) </code></pre><p>для получения обычного формата времени вы можете использовать:</p><pre><code>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); </code></pre>

<p>мы можем использовать функцию clock\_gettime с clock\_realtime в качестве типа часов.</p><p>ссылка <a href="http://linux.die.net/man/3/clock\_gettime">http://linux.die.net/man/3/clock\_gettime</a> </p><p>простое выполнение исполняемого файла strace on date дает нам идею получить текущую дату в режиме ядра.</p>