web-dev-qa-db-fra.com

Comment obtenir l'heure actuelle (heure de la journée) dans l'espace noyau Linux

J'écris un module de noyau qui vérifie si le temps est compris entre deux heures spécifiées et désactive l'entrée si c'est le cas. Cela tient à ce que je veux m'assurer de me coucher tôt. (Je sais que je pourrais également utiliser un certain nombre de techniques différentes, y compris cron, etc., mais je voulais apprendre la programmation par le noyau ...)

En tant que première version, je vérifie donc si l'heure actuelle est comprise entre le début et la fin, qui sont définies via les paramètres du module.

Ma question est donc: comment puis-je obtenir l'heure actuelle? Je n'ai pas accès aux fonctions de temps habituelles dans la bibliothèque standard car je suis dans l'espace du noyau. Je suppose que je devrais utiliser do_gettimeofday () pour cela, mais cela ne me donne que quelques secondes et nanosecondes, et il me faut des heures dans la journée en cours.

Merci.

21
Tom Macdonald

time_to_tm function peut vous aider, ce qui retourne la structure tm . Fuseau horaire disponible dans la variable sys_tz , il peut vous aider à définir correctement votre décalage pour obtenir l'heure locale.

15
Zimbabao

Pour obtenir l'heure locale dans le noyau, ajoutez l'extrait de code ci-dessous à votre pilote de noyau:

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

Cela fonctionne bien pour moi:

#include <linux/time.h>
...
/* getnstimeofday - Returns the time of day in a timespec */
void getnstimeofday(struct timespec *ts)

Pour obtenir le format d’heure habituel, vous pouvez utiliser:

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

Nous pouvons utiliser la fonction clock_gettime avec CLOCK_REALTIME comme type d'horloge.

Référence http://linux.die.net/man/3/clock_gettime

Faire juste un strace sur l'exécutable de la date nous donne une idée pour obtenir la date actuelle en mode noyau.

0
sunmoon