我正在尝试创建自定义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;
}
答案 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);