linux内核中时间的辨析

本文讲述了在Linux内核5.4.89中遇到的获取当前时间戳的问题。原来使用的CURRENT_TIME宏已过时,现在inode的a_time、c_time和m_time改为timespec64类型。作者发现使用ktime_get_ts64得到的是1970年的初始时间,原因是混淆了CLOCK_MONOTONIC和CLOCK_REALTIME的区别。解决办法是改用ktime_get_real_ts64以获取CLOCK_REALTIME时间,但内核中已有current_time函数可以直接使用。此外,作者还推荐了ctags作为比SourceInsight更有效的代码搜索工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在samplefs中遇到了一个获取当前时间戳的问题,源代码中使用的是过时的宏CURRENT_TIME获取当前时间,在新内核中,inode的a_timec_timem_time
都调整为timespec64类型,而且内核的时间模块也经过了相当大的调整,所以需要进行修改来适应当前的内核(5.4.89)。

经过一番查阅后,使用如下的代码获取当前时间戳:

struct timespec64 ts;
ktime_get_ts64(&ts);
inode->m_time = ts;

但是发现得到的时间是1970年的初始时间戳,这个问题是因为对于linux的时间理解不够详细,主要是对于CLOCK_MONOTONICCLOCK_REALTIME的理解出现了偏差。简单来说,CLOCK_MONOTONIC指的是系统启动到当前的时间,这个时间是不可以修改的,而CLOCK_REALTIME也就是我们常说的墙钟时间,即从1970年到现在经过的时间。

而在ktime_get_real的官方文档中也提到:

This is used for all timestamps that need to persist across a reboot, like inode times, but should be avoided for internal uses, since it can jump backwards due to a leap second update, NTP adjustment settimeofday() operation from user space.

所以对于inode的三个时间成员的时间戳获取应该使用CLOCK_REALTIME,代码中改成ktime_get_real_ts64即可正常获取当前时间戳。

顺便说一下,上文文档中提到避免internal use,之后发现在新内核中,fs/inode.c中实现了一个struct timespec64 current_time(struct inode *inode)函数,所以可以不用ktime_get_real_ts64这个函数了。

另外:ctags真好用,比source insight高到不知道哪里去了。就拿current_time这个函数来说,Source Insight一直表示找不到定义,ctags瞬间就找到了。。。

参考资料:CLOCK_MONOTONIC与CLOCK_REALTIME区别kernel.org/core-api/timekeeping.cLinux下安装和使用ctags

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值