温馨提示×

Linux readdir返回值有哪些含义

小樊
44
2025-12-21 07:09:39
栏目: 智能运维

在Linux中,readdir()函数用于读取目录中的条目。它的原型在<dirent.h>头文件中定义,如下所示:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

readdir()函数接受一个指向DIR结构体的指针作为参数,该结构体表示一个已打开的目录流,并返回一个指向dirent结构体的指针,该结构体包含有关目录中的一个条目的信息。如果到达目录流的末尾,则返回NULL。

dirent结构体通常包含以下字段:

  • d_ino: 目录项的inode号。
  • d_off: 目录项在目录文件中的偏移量。
  • d_reclen: dirent结构的长度。
  • d_name: 目录项的名称。

readdir()函数的返回值及其含义如下:

  1. 成功: 返回一个指向dirent结构体的指针,该结构体包含了目录中的一个条目的信息。如果成功读取了目录中的下一个条目,则返回的指针指向该条目的dirent结构体。

  2. 到达目录末尾: 如果已经到达目录流的末尾,readdir()函数将返回NULL。这并不意味着出现了错误,只是表示没有更多的目录条目可以读取。

  3. 错误: 如果在读取目录时发生错误,readdir()函数也可能返回NULL。在这种情况下,可以通过调用errno变量来确定具体的错误类型。一些可能的错误包括:

    • EACCES: 权限不足,无法访问目录。
    • EBADF: dirp不是一个有效的目录流指针。
    • EIO: I/O错误发生。
    • ENOTDIR: dirp指向的不是一个目录。
    • ENOMEM: 内存不足。

在使用readdir()函数时,通常会在一个循环中调用它,直到返回NULL为止,这样可以遍历目录中的所有条目。下面是一个简单的例子:

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

int main() {
    DIR *dir;
    struct dirent *entry;

    dir = opendir("."); // 打开当前目录
    if (dir == NULL) {
        perror("opendir");
        exit(EXIT_FAILURE);
    }

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

    if (closedir(dir) == -1) {
        perror("closedir");
        exit(EXIT_FAILURE);
    }

    return 0;
}

在这个例子中,程序打开当前目录,然后循环调用readdir()来读取每个条目,直到返回NULL。对于每个条目,它打印出条目的名称。最后,它关闭目录流。如果在任何时候发生错误,程序将打印出一个错误消息并退出。

0