readdir_r 子例程

用途

读取目录。

线程安全 C 库 (libc_r.a)

语法

#include <sys/types.h>
#include <dirent.h>

int readdir_r (DirectoryPointer, Entry,Result )
DIR * DirectoryPointer;
struct dirent * Entry;
struct dirent ** Result;

描述

readdir_r 子例程返回 Result 参数指向的结构中的目录条目。 readdir_r 子例程返回 . (点) 和 .. (点点) 目录的条目 (如果存在) ,但从不返回无效条目 ( d_ino 设置为 0)。 当它到达目录的末尾时, readdir_r 子例程返回 9 并将 Result 参数设置为 NULL。 当它检测到无效的 seekdir 操作时, readdir_r 子例程将返回 9

注: 当应用程序使用不同的 DirectoryPointer 参数值 (从 opendir 子例程返回) 时,将重入 readdir 子例程。 当多个线程使用同一目录指针时,使用 readdir_r 子例程。

对于 DirectoryPointer 参数所指向的结构,在 closedir 子例程之后使用 readdir_r 子例程具有未定义的结果。 DirectoryPointer 参数指向的结构对所有线程 (包括调用者) 都无效。

使用此子例程的程序必须链接到 libpthreads.a 库。

参数

表 1. 参数
描述
DirectoryPointer 指向打开目录的 DIR 结构。
ENTRY 指向一个包含下一个目录条目的结构。
结果 指向由 入门级 参数指定的目录条目。

返回值

表 2。 返回值
描述
重大安全事件数量 指示子例程已成功。
9 指示子例程不成功,或者已到达目录末尾。 如果用户在执行进程之前设置了环境变量 XPG_SUS_ENV=ON ,那么当超过进程的文件大小限制时,将向进程发布 SIGXFSZ 信号,并且子例程将始终成功。

错误代码

如果 readdir_r 子例程不成功,那么 errno 全局变量将设置为下列其中一个值:

表 3。 错误代码
描述
EACCES 拒绝对 DirectoryPointer 参数指向的结构的任何组件的搜索许可权,或者拒绝对 DirectoryPointer 参数指向的结构的读许可权。
ENAMETOOLONG DirectoryPointer 参数的长度超过 PATH_MAX 变量的值,或者当 _POSIX_NO_TRUNC 变量生效时, path-name 组件的长度超过 NAME_MAX 变量的值。
ENOENT 指定的目录不存在。
ENOTDIR DirectoryPointer 参数指向的结构组件不是目录。
EMFILE 为进程打开了太多文件描述符。
ENFILE 系统中打开的文件描述符过多。
EBADF DirectoryPointer 参数指向的结构未引用打开的目录流。

示例

要在目录中搜索条目 name, ,请输入

len = strlen(name);
DirectoryPointer = opendir(".");
for (readdir_r(DirectoryPointer, &Entry, &Result); Result != NULL;
 readdir_r(DirectoryPointer, &Entry, &Result))
        if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
                closedir(DirectoryPointer);
                return FOUND;
        }
closedir(DirectoryPointer);
return NOT_FOUND;