温馨提示×

Debian readdir如何处理

小樊
40
2026-08-12 07:28:57
栏目: 智能运维

在 Debian(以及所有 Linux 系统)里,readdir 通常有两种常见含义,我分开说明,你可以看看你问的是哪一种。


一、C 语言中的 readdir()(最常见)

1️⃣ 基本用法

readdir() 用于读取目录内容,定义在:

#include <dirent.h>

函数原型:

struct dirent *readdir(DIR *dirp);

2️⃣ 基本流程

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

int main() {
    DIR *dir = opendir(".");
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

3️⃣ struct dirent 常用字段

struct dirent {
    ino_t          d_ino;       // inode 号
    off_t          d_off;
    unsigned short d_reclen;
    unsigned char  d_type;      // 文件类型(DT_REG、DT_DIR 等)
    char           d_name[256]; // 文件名
};

注意

  • readdir() 返回 ...
  • 返回的顺序不保证排序
  • 线程不安全(线程安全版本是 readdir_r(),但已不推荐)

4️⃣ 判断文件类型(推荐方式)

if (entry->d_type == DT_REG) {
    printf("普通文件: %s\n", entry->d_name);
} else if (entry->d_type == DT_DIR) {
    printf("目录: %s\n", entry->d_name);
}

⚠️ 有些文件系统(如某些 NFS)d_type 可能是 DT_UNKNOWN,这时要用 lstat()


二、Debian / Linux 系统层面的 readdir 实现

系统调用角度看:

  • readdir() 不是系统调用
  • 底层使用的是:
    getdents() / getdents64()
    

关系:

opendir()
  ↓
open()
  ↓
getdents64()   ← 内核真正读取目录
  ↓
readdir()      ← glibc 封装

你可以在 Debian 下查看:

man 2 getdents
man 3 readdir

三、Shell 中的“readdir”(不常见)

在 shell 中没有 readdir 命令,一般用:

ls

for f in *; do
    echo "$f"
done

如果你是在某个脚本中看到 readdir,可能是:

  • 自定义函数
  • Perl / Python 的封装
  • FUSE / 文件系统相关代码

四、常见问题

❓ readdir 读不到文件?

  • 目录无权限:ls -ld dir
  • 目录正在被修改
  • 使用了错误的路径

❓ readdir 返回 NULL 是错误吗?

不一定:

  • 返回 NULL 可能是到达目录结尾
  • 错误时 errno 会被设置
if (readdir(dir) == NULL) {
    if (errno != 0) {
        perror("readdir");
    }
}

五、如果你是问别的场景

你可以具体说明:

  • ✅ 是 C 程序
  • ✅ 是 系统调用问题
  • ✅ 是 Python / Perl 的 readdir
  • ✅ 是 deb 包 / dpkg / apt 内部 readdir

我可以针对你具体场景继续讲。

0