【问题标题】:Custom Linux kernel module to display year, date and time自定义 Linux 内核模块以显示年份、日期和时间
【发布时间】:2014-12-01 20:24:20
【问题描述】:

我正在尝试创建一个自定义的 linux 内核模块。我要显示:

year-month-day hour:minute:second.

到目前为止,我已经得到了小时:分钟:秒的工作,但我无法让 Year 工作。我正在使用 linux/time.h 标头中的“tm_year”,但是当我使用我的模块时,年份显示不正确。这只是一长串随机数。任何帮助,将不胜感激。我只能访问 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;
}

【问题讨论】:

  • 这是预期的行为,因为除了在堆栈上声明它之外,您还没有对 tv2 做任何事情。
  • @Peter 显然这是意料之中的,这就是我寻求指导的原因

标签: linux linux-kernel


【解决方案1】:

这行得通。我刚试过。您可以使用 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);

【讨论】:

  • 非常感谢!我有一个愚蠢的问题。使用 tm 结构时,可以使用诸如“tm_mon”和“tm_mday”之类的整数。 “tm_mday”表示“一个月中的哪一天,范围为 1 到 31”。它在说什么“月份”?如果我向它添加一个偏移量以使其与当月的今天相匹配,它会在每个月保持准确吗?
  • @GeorgeCostanza [你的问题并不愚蠢]。详细信息在代码中。大多数内核子系统不关心诸如一年中的哪一天等外部信息。它们会查看时间戳等。在此处检查代码以了解内核中通常如何使用结构和函数:lxr.free-electrons.com/source(可搜索)
  • 我正在尝试按照您的建议合并系统时区,但遇到了一些问题。我需要将 gettimeofday 与 timezone 结构一起使用。我需要包含 sys/time.h 才能使用 gettimeofday 但我不断收到致命错误,没有这样的文件或目录。网上没有例子,所以我敢肯定没有人会浪费时间做我想做的事。
  • @GeorgeCostanza 感兴趣的变量是 sys_tz,由 time.c 导出。另请查看:lxr.free-electrons.com/source/kernel/time/timeconv.clxr.free-electrons.com/source/kernel/time.c
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2016-04-14
    相关资源
    最近更新 更多