gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:06 24 4
gpt4 key购买 nike

我正在尝试以人类可读的格式在我自己的自定义系统调用中打印时间(例如 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 类型时出错。

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

谢谢!

最佳答案

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

相反,您可以使用 time_to_tm()来自 <linux/time.h>转换 time_tstruct tm 中的故障时间, 然后打印 struct tm 的组件单独。

请注意,您必须为 time_to_tm() 提供时区偏移量,因为内核没有整体的“当前时区”——时区是一个显示设置,因此完全在用户空间中处理。这就是为什么内核通常不会将时间格式化为“人类可读”本身的原因之一。如果您没有合适的值来提供时区偏移量,则可以使用零,这意味着 segmentation 时间采用 UTC。

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

关于c - 编写打印人类可读时间的内核系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28226347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com