我正在尝试以人类可读的格式打印我自己的自定义系统调用中的时间(例如Jan 29 2015 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 时出现错误。
我知道这意味着时间出了问题,但究竟是什么?我不允许将其包含在系统调用中吗?
谢谢!
内核编码环境不是 C 的"托管"实现,这意味着各种标准 C 函数(如 ctime()
)可能不存在,或者即使存在,也可能与标准函数的行为方式不同。 事实上,内核中根本不存在ctime()
。
相反,您可以使用<linux/time.h>
中的time_to_tm()
将time_t
转换为struct tm
中的细分时间,然后单独打印struct tm
的组件。
请注意,您必须提供时区偏移量time_to_tm()
,因为内核没有整体的"当前时区" - 时区是一种显示设置,因此完全在用户空间中处理。 这就是为什么内核通常不会将时间格式化为"人类可读"的原因之一。 如果您没有为时区偏移量提供良好的值,则可以使用零,这意味着细分时间采用 UTC。
代替time()
,要获得内核内部的当前时间到秒粒度,请使用get_seconds()
。
ctime()
函数在内核中不可用。
事实上,内核中可用的日期/时间格式化函数很少;大多数这些功能仅在用户空间中可用。如果要在内核中生成时间戳,请不要尝试格式化它;只需返回一个time_t
,然后让用户空间应用程序处理格式设置。
如果这还不够,并且您确实想要一个可读的时间戳,则需要自己定义必要的函数。