自定义Linux内核模块,用于显示年份,日期和时间

时间:2014-09-26 22:46:00

标签: linux linux-kernel

我正在尝试创建自定义Linux内核模块。我想要显示:

year-month-day hour:minute:second.

到目前为止,我已经得到了一小时:分钟:第二次上班,但我无法上班。我正在使用" tm_year"从linux / time.h标题开始,但当我捕捉我的模块时,年份没有正确显示。它只是一长串随机数。任何帮助,将不胜感激。我只能访问linux头文件,因为内核需要在内核空间中运行。代码很难看,但我现在正在试验:

#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/time.h>
MODULE_LICENSE("GPL");

static int hello_proc_show(struct seq_file *m, void *v) {

// seq_printf(m, "Hello proc!\n");

unsigned long get_time;
int sec, hr, min, tmp1,tmp2, tmp3;
struct timeval tv;
struct tm tv2;

do_gettimeofday(&tv);
get_time = tv.tv_sec;
sec = get_time % 60;
tmp1 = get_time / 60;
min = tmp1 % 60;
tmp2 = tmp1 / 60;
hr = (tmp2 % 24) - 4;
tmp3 = tv2.tm_year;

seq_printf(m, "time ::  %d:%d:%d\n",hr,min,sec);
seq_printf(m, "Year: %d\n", tmp3);




 return 0;
}

2 个答案:

答案 0 :(得分:2)

这很有效。我刚尝试过。您可以使用time_to_tm()在值之间进行转换。请注意,如果您想要非常精确,请使用系统时区在本地了解小时,分钟和秒。

另外,我打印到系统日志而不是proc条目。

    unsigned long get_time;
    int sec, hr, min, tmp1,tmp2, tmp3;
    struct timeval tv;
    struct tm tv2;

    do_gettimeofday(&tv);
    get_time = tv.tv_sec;
    sec = get_time % 60;
    tmp1 = get_time / 60;
    min = tmp1 % 60;
    tmp2 = tmp1 / 60;
    hr = (tmp2 % 24) - 4;
    time_to_tm(get_time, 0, &tv2);
    tmp3 = tv2.tm_year;

    printk(KERN_INFO "time ::  %d:%d:%d\n",hr,min,sec);
    /* Add years since 1900. */
    printk(KERN_INFO "Year: %d\n", tmp3 + 1900);

答案 1 :(得分:1)

这是我在内核模块中用来获取系统时间的方法

    struct timeval now;
    struct tm tm_val;

    do_gettimeofday(&now);
    time_to_tm(now.tv_sec, 0, &tm_val);
    printk(KERN_INFO "%d/%d %02d:%02d:%02d Days since 1 Jan: %d\n", tm_val.tm_mon + 1,
                    1900 + tm_val.tm_year, tm_val.tm_hour, tm_val.tm_min,
                    tm_val.tm_sec, tm_val.tm_yday);