linux 我如何在内核中打印当前时间?

bkkx9g8r  于 2022-11-02  发布在  Linux
关注(0)|答案(2)|浏览(485)

我是一个linux的初学者。(抱歉我的英语不好)我应该打印当前时间,并通过linux中的系统调用做一些事情。我做了其他事情,但未能打印当前时间。。我写了这样的


# include<linux/kernel.h>

# include<linux/time.h>

...
asmlinkage long sys_printtime(void) {
     ...
     struct timeval time;
     struct tm tm1;
     ...

     do_gettimeofday(&time);
     local_time=(u32)(time.tv_sec -(sys_tz.tz_minuteswest * 60));
     time_to_tm(local_time,(3600*9),&tm1);
     printk(KERN_DEBUG "time @(%04d-%02d-%02d %02d:%02d:%02d)\n", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
    ...
    return 0;
}

但它不起作用。
这个错误说我不能使用do_gettimeofday,我终于知道我不能再使用do_gettimeofday了,因为kernel5不支持。我在google和stackoverflow上搜索,但是我不知道如何在kernel5中打印当前时间。有人能帮助我吗?

iugsix8n

iugsix8n1#

是的,因为y2038问题,do_gettimeofday已经被移除。取而代之的是内核提供了时间接口,你可以根据自己的需要来使用。请查看https://www.kernel.org/doc/html/latest/core-api/timekeeping.html文档。
例如,您有ktime_get_ts64(struct timespec64 *ts),它将以秒和纳秒为单位提供时间。

struct timespec64 {
    time64_t    tv_sec;         /* seconds */
    long        tv_nsec;        /* nanoseconds */
};

如果您只想以纳秒为单位,您可以使用u64 ktime_get_ns(void)。请查看上面的文档以了解适合您的用途。您也可以查看timekeeping.hktime.h以了解更多信息。
如果你想找到一个例子,只需在内核源代码中使用grep -rni <func name>cscope搜索函数名即可。

5vf7fwbs

5vf7fwbs2#

还有一个获取rtc时间的单行程序,如下所示:


# include <linux/ktime.h>

# include <linux/rtc.h>

struct rtc_time t = rtc_ktime_to_tm(ktime_get_real());
printk(KERN_INFO "%ptRs", &t);

ktime_get_real的文档可以在这里找到。我没有找到任何关于rtc_ktime_to_tm的文档,甚至在代码中也没有,但它可以将Unix纪元的时间以纳秒为单位作为struct rtc_time的输入和输出。如何打印struct rtc_time可以在这里找到。

相关问题