如何获取linux内核空间中的当前小时(时间)

时间:2011-02-22 10:56:33

标签: c linux linux-kernel kernel-module

我正在编写一个内核模块,用于检查时间是否在两个指定的小时之间,如果是,则禁用输入。这与我想要确保我早点睡觉有关。 (我知道我也可以使用任何数量的不同技术,包括cron等,但我想学习内核编程......)

作为第一个版本,我因此检查当前小时是否在开始和结束之间,这是通过参数设置到模块。

因此,我的问题是:如何获得当前时间?我无法访问标准库中的常用时间函数,因为我在内核空间中。我猜我应该使用do_gettimeofday(),但这只能给我秒和纳秒,而且我在当天需要几个小时。

感谢。

5 个答案:

答案 0 :(得分:15)

time_to_tm函数可以是您的帮助,它返回结构tm。时区可用变量sys_tz,它可以帮助您正确设置偏移以获得当地时间。

答案 1 :(得分:6)

要在内核中获取本地时间,请在下面的代码片段中添加内核驱动程序:

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

答案 2 :(得分:1)

这对我很有用:

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

答案 3 :(得分:0)

我们可以使用clock_gettime函数和CLOCK_REALTIME作为时钟类型。

参考http://linux.die.net/man/3/clock_gettime

只需对日期可执行文件进行操作即可让我们了解如何在内核模式下获取当前日期。

答案 4 :(得分:-1)

将do_gettimeofday结果转换为一小时非常简单,因为它从格林威治标准时间午夜开始。

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

然后调整您当地的时区