linux - 在 struct inode 中访问纳秒

标签 linux filesystems kernel inode

在 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/

相关文章:

linux - inode 数据结构中的数据指针

c++ - 如何在 Linux 上为 C++ 应用程序分配 "huge"页面

linux - 用sed(linux)替换多个文件中的URL(文本)

linux - 基本for循环脚本

perl - 为什么Perl的两个arg公开似乎剥夺了换行符?

ios - 将 OSX 文件夹复制到 iOS 目录

在linux下使用dlopen() api时,可以在_init()函数中添加参数吗?

linux - 如何创建和部署自定义的嵌入式 Linux 镜像

C-使用内核模块显示CPU信息

linux - 如何从用户空间调用 compat ioctl?有人可以提供一些例子吗?