Comment faire pour obtenir l'heure actuelle (heure de la journée) dans l'espace du noyau linux
Je suis en train d'écrire un module du noyau qui vérifie pour voir si le temps est entre deux heures précisées, et désactive l'entrée si elle est. Cela a à voir avec moi vouloir vous assurer que je vais au lit tôt. (Je sais que je pourrais aussi utiliser n'importe quel nombre de différentes techniques, dont la cron, etc, mais je voulais apprendre la programmation kernel...)
Comme une première version, j'ai donc vérifier si l'heure actuelle est entre le début et la fin, qui sont définies par les paramètres du module.
Ma question est donc : Comment puis-je obtenir l'heure actuelle? Je n'ai pas accès à l'heure habituelle des fonctions de la bibliothèque standard, parce que je suis dans l'espace du noyau. Je suppose que je devrais être à l'aide de do_gettimeofday() pour cela, mais qui ne me donne secondes et nanosecondes, et j'ai besoin d'heures dans la journée en cours.
Grâce.
- Je ne connais pas la réponse, même à distance, mais +1 pour le piratage du noyau, de sorte que vous pouvez dormir tôt!
- 😀 j'avoue, je suis un geek total...
- Je tiens juste à dire, par exemple un module du noyau n'a pas l'air agréable pour déboguer!
- ssh devrait faire l'affaire.
Vous devez vous connecter pour publier un commentaire.
time_to_tm fonction peut être de votre aide, qui retourne la structure tm. Fuseau horaire disponible dans la variable sys_tz, il peut vous aider à définir votre décalage correctement pour obtenir l'heure locale.
Pour obtenir l'heure locale dans le noyau, ajouter l'extrait de code ci-dessous votre pilote du noyau:
Cela fonctionne bien pour moi:
Pour l'obtention d'habitude format de l'heure vous pouvez utiliser:
Nous pouvons utiliser clock_gettime fonction avec CLOCK_REALTIME que le type d'horloge.
Référence http://linux.die.net/man/3/clock_gettime
Faire juste un strace sur la date de l'exécutable nous donne une idée pour obtenir la date actuelle dans le mode noyau.
La conversion de la do_gettimeofday résultat à une heure, c'est assez simple, puisqu'il démarre à minuit GMT.
Puis régler votre fuseau horaire local
localtime
etgmtime
compte pour cela.