在 linux 内核 v4.19.3 中
在我的模块中,我需要以纳秒而不是秒为单位获取 inode 最后修改时间,但它始终返回 0。
结构timespec64 i_mtime;
例如在这段代码中:
pr_info("nsec = %ld - sec = %lld\n",inode->i_mtime.tv_nsec,inode->i_mtime.tv_sec);
此代码返回:
nsec = 0 - sec = 1593096577
有什么想法吗?
最佳答案
当然,这可能取决于您的 inode 所在的特定文件系统。此外,时间恰好是整数秒的可能性很小。
但是,您所观察到的行为最可能的原因是,在某些 Linux 文件系统中,inode
中每个与时间相关的 timespec
结构的纳秒部分创建 inode 时,结构设置为零。因此,例如,如果您在上次修改的时间戳中得到零纳秒,则可能意味着该文件自创建以来未被修改。
这是一个最小的内核模块,用于打印预定义文件的修改时间。它在内核 4.15.0-101-generic
的 Ubuntu 上编译和工作。该模块有意不加载到内核中,并在打印出时间戳值后退出。
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/namei.h>
#define S_NAME "test.txt"
static int __init s_init(void)
{
int ret;
struct path path;
ret = kern_path(S_NAME, LOOKUP_FOLLOW, &path);
if (ret) {
pr_info("File not found '%s'\n", S_NAME);
} else {
pr_info("nsec = %ld - sec = %ld\n",
path.dentry->d_inode->i_mtime.tv_nsec,
path.dentry->d_inode->i_mtime.tv_sec);
}
return -1;
}
module_init(s_init);
MODULE_LICENSE("GPL");
关于linux - 在 struct inode 中访问纳秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62578351/