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

时间:2015-01-29 23:03:31

标签: c linux linux-kernel kernel system-calls

我试图以人类可读的格式在我自己的自定义系统调用中打印时间(例如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 ;
}

我在隐含的功能声明中遇到错误&#39; time&#39;即使我包含了linux / time.h(我也尝试过time.h),并且&#39; ctime&#39; 当我指定%s时,ctime返回类型int时出错。

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

谢谢!

2 个答案:

答案 0 :(得分:3)

内核编码环境不是&#34;托管&#34; C的实现,这意味着像ctime()这样的各种标准C函数可能不存在,或者如果它们存在,可能与标准函数的行为方式不同。实际上,内核中根本不存在ctime()

相反,您可以使用time_to_tm()中的<linux/time.h>time_t转换为struct tm中的细分时间,然后打印{{1}的组件单独地。

请注意,您必须向struct tm提供时区偏移量,因为当前时区没有&#34;&#34;对于内核 - 时区是一个显示设置,因此完全在用户空间中处理。这就是为什么内核通常没有格式化时间以便人类可读的原因之一。本身。如果您没有为时区偏移提供良好的价值,则可以使用零,这意味着故障时间以UTC为单位。

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

答案 1 :(得分:0)

内核中没有ctime()函数。

实际上,内核中可用的日期/时间格式化函数非常少;大多数这些功能仅在用户空间中可用。如果要在内核中生成时间戳,请不要尝试对其进行格式化;只返回time_t并让用户空间应用程序处理格式化。

如果这还不够,并且真的想要一个可读的时间戳,那么您需要自己定义必要的功能。