温馨提示×

ubuntu readdir在哪实现

小樊
44
2026-10-09 13:27:24
栏目: 智能运维

在 Ubuntu(Linux) 中,readdir 相关功能的实现分布在 C 库(glibc) 和 Linux 内核 两个层面。下面分层说明。


1. 用户态:readdir 在 glibc 中的实现

1.1 头文件

#include <dirent.h>

相关函数:

  • opendir()
  • readdir()
  • closedir()
  • readdir_r()(已废弃)

1.2 glibc 源码位置(典型路径)

如果你下载了 glibc 源码:

glibc/sysdeps/posix/readdir.c
glibc/sysdeps/unix/sysv/linux/readdir.c
glibc/sysdeps/unix/sysv/linux/closedir.c
glibc/sysdeps/unix/sysv/linux/opendir.c

Ubuntu 上安装 glibc 源码:

apt source glibc

1.3 核心调用关系

readdir() 实际上不是直接 syscall,而是:

readdir()
  └─ getdents64()  (系统调用)

glibc 会:

  • 缓存目录项
  • 一次 getdents64 读取多个 entry
  • 逐个返回 struct dirent *

2. 内核态:getdents / getdents64 的实现

2.1 系统调用

int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count);
int getdents64(unsigned int fd, struct linux_dirent64 *dirp, unsigned int count);

2.2 内核源码位置(Linux kernel)

fs/readdir.c

关键函数:

  • sys_getdents()
  • sys_getdents64()
  • iterate_dir()
  • filldir() / filldir64()

示例(简化):

SYSCALL_DEFINE3(getdents64, unsigned int, fd,
                struct linux_dirent64 __user *, dirent,
                unsigned int, count)
{
    struct fd f = fdget(fd);
    error = iterate_dir(f.file, &buf.ctx);
}

3. 文件系统层(具体实现)

不同文件系统实现 ->iterate 接口:

fs/ext4/dir.c
fs/xfs/xfs_file.c
fs/btrfs/inode.c

例如 ext4:

const struct file_operations ext4_dir_operations = {
    .iterate_shared = ext4_readdir,
};

4. 总结调用链(Ubuntu)

用户程序
  └─ readdir()               [glibc]
       └─ getdents64()      [syscall]
            └─ iterate_dir() [kernel fs/readdir.c]
                 └─ ext4_readdir() [具体文件系统]

5. 调试 / 查看方法

查看系统调用:

strace ls

查看内核实现:

apt source linux

或在线:

  • https://elixir.bootlin.com/linux/latest/source/fs/readdir.c

如果你愿意,我可以:

  • 带你 逐行读 glibc readdir 源码
  • 或 画一张 readdir 的完整调用流程图
  • 或分析 Ubuntu 某个具体版本(如 22.04)的实现差异

你更想深入哪一层?

0 踩