编写打印人类可读时间的内核系统调用

Write kernel system call that prints human readable time

我正在尝试以人类可读的格式在我自己的自定义系统调用中打印时间(例如 2015 年 1 月 29 日 05:53:12,尽管任何顺序都可以)。我正在使用我知道在标准 C 程序中工作的代码,因为我以前使用过它,但由于某种原因它在系统调用中不起作用。

#include<linux/linkage.h>
#include<linux/kernel.h>
#include<linux/sched.h>
#include<linux/time.h>

asmlinkage long sys_mycall (int someVal)
{
    time_t t;
    time(&t);

    printk("myInt: %d", someVal);
    printk("%s", ctime(&t)) ;

    return 0 ;
}

我在函数 'time' 和 'ctime' 的隐式声明中遇到错误,即使我包含了 linux/time.h(我也只尝试了 time.h)。 当我指定 %s 时,ctime 返回 int 类型时出错。

我知道这意味着 time.h 出了点问题,但究竟是什么问题?我不允许在系统调用中包含它吗?

谢谢!

ctime() 函数在内核中不可用。

事实上,内核中可用的格式化函数很少date/time;其中大部分功能仅在用户 space 中可用。如果要在内核中生成时间戳,请不要尝试对其进行格式化;只需 return 一个 time_t 并让用户space 应用程序处理格式设置。

如果这还不够,并且您确实想要一个可读的时间戳,您需要自己定义必要的函数。

内核编码环境不是 C 的 "hosted" 实现,这意味着 ctime() 等各种标准 C 函数可能不存在,或者即使存在,也可能不会以相同的方式运行作为标准功能。事实上,ctime()根本不存在于内核中。

相反,您可以使用 <linux/time.h> 中的 time_to_tm()time_t 转换为 struct tm 中的细分时间,然后打印 struct tm个人。

请注意,您必须为 time_to_tm() 提供时区偏移量,因为内核没有整体 "current timezone" - 时区是一种显示设置,因此完全在用户空间中处理。这就是为什么内核通常不将时间格式化为 "human-readable" 本身的原因之一。如果您没有合适的时区偏移值,您可以使用零,这意味着细分时间为 UTC。

而不是 time(),要在内核中获取当前时间到秒的粒度,请使用 get_seconds()