我试图以人类可读的格式在我自己的自定义系统调用中打印时间(例如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调用中包含它吗?
谢谢!
答案 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
并让用户空间应用程序处理格式化。
如果这还不够,并且真的想要一个可读的时间戳,那么您需要自己定义必要的功能。