温馨提示×

Debian readdir参数

小樊
46
2026-07-27 23:05:12
栏目: 智能运维

readdirPOSIX 标准 中用于读取目录内容的函数,在 Debian(以及所有 Linux 发行版) 中属于 glibc 提供的接口。它本身没有“Debian 特有参数”,参数和语义与标准 UNIX/Linux 一致。

下面按常见使用场景说明。


1. readdir(POSIX,最常用)

函数原型

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

参数

参数 说明
dirp opendir() 返回的目录流指针

返回值

  • 成功:返回指向 struct dirent 的指针
  • 到达目录尾:返回 NULL
  • 出错:返回 NULL,并设置 errno

示例

#include <dirent.h>
#include <stdio.h>

int main() {
    DIR *dir = opendir(".");
    struct dirent *entry;

    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

2. struct dirent 结构(关键字段)

struct dirent {
    ino_t          d_ino;       // inode 号
    off_t          d_off;       // 偏移(不推荐直接使用)
    unsigned short d_reclen;    // 记录长度
    unsigned char  d_type;      // 文件类型(部分文件系统支持)
    char           d_name[256]; // 文件名
};

d_type 常见取值

含义
DT_REG 普通文件
DT_DIR 目录
DT_LNK 符号链接
DT_BLK 块设备
DT_CHR 字符设备
DT_FIFO 管道
DT_SOCK socket

⚠️ 注意:某些文件系统(如 ext4 支持,NFS 可能不支持)d_type 可能为 DT_UNKNOWN


3. readdir_r(已废弃)

Debian / glibc 中不推荐使用

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

✅ 原因:

  • 存在线程安全问题
  • POSIX.1-2008 标记为 obsolete
  • 推荐使用 readdir() + 锁,或 readdir_r() 的替代方案

4. getdents(Linux 特有,底层系统调用)

系统调用

#include <sys/syscall.h>
#include <unistd.h>

int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count);
  • 不是 glibc 的标准 API
  • Debian 上可用,但一般不直接使用
  • readdir() 内部就是调用 getdents()

5. Debian 常见相关包

dpkg -L libc6 | grep readdir

头文件位置:

/usr/include/dirent.h

6. 常见误区

❌ 错误理解:

  • readdir 有 flags 参数(没有
  • 可以指定排序方式(不能

✅ 正确做法:

  • 排序:读取后自行 qsort
  • 过滤:判断 d_name

7. 总结

接口 推荐度 说明
readdir() ✅✅✅ 标准、安全、推荐
readdir_r() 已废弃
getdents() ⚠️ 底层系统调用

如果你是想问:

  • Debian 下 readdir 为什么读不到某些文件?
  • readdir 与 NFS / overlayfs 的兼容性?
  • readdir 返回顺序是否稳定?

可以直接告诉我你的具体场景,我可以针对性说明。

0