unidos pais michigan miami hora georgia europa estados detroit atlanta c linux linux-kernel kernel-module

pais - hora en michigan city



Cómo obtener la hora actual(hora del día) en el espacio del kernel de Linux (5)

Esto funciona bien para mi:

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

Para obtener el formato de hora habitual, puede usar:

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

Estoy escribiendo un módulo kernel que verifica si el tiempo está entre dos horas especificadas y deshabilita la entrada si es así. Esto tiene que ver conmigo que quiero asegurarme de irme a la cama temprano. (Sé que también podría usar cualquier cantidad de técnicas diferentes, incluyendo cron, etc., pero quería aprender la programación del kernel ...)

Como primera versión, por lo tanto, compruebo si la hora actual está entre el inicio y el final, que se establecen mediante parámetros en el módulo.

Mi pregunta es por lo tanto: ¿Cómo obtengo la hora actual? No tengo acceso a las funciones de tiempo habituales en la biblioteca estándar porque estoy en el espacio del kernel. Supongo que debería usar do_gettimeofday () para esto, pero eso solo me da segundos y nanosegundos, y necesito horas en el día actual.

Gracias.


La conversión del resultado de do_gettimeofday a una hora es bastante simple, ya que comienza a la medianoche GMT.

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

Luego ajusta tu zona horaria local


Para obtener la hora local en kernel, agregue el siguiente fragmento de código a su controlador de kernel:

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


Podemos usar la función clock_gettime con CLOCK_REALTIME como el tipo de reloj.

Referencia http://linux.die.net/man/3/clock_gettime

Simplemente haciendo un strace on date executable nos da una idea para obtener la fecha actual en el modo kernel.


La función time_to_tm puede ser de su ayuda, lo que devuelve la estructura tm . Zona horaria disponible en la variable sys_tz , puede ayudarte a configurar tu desplazamiento de forma adecuada para obtener la hora local.