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 库。
参数
| 项 | 描述 |
|---|---|
| DirectoryPointer | 指向打开目录的 DIR 结构。 |
| ENTRY | 指向一个包含下一个目录条目的结构。 |
| 结果 | 指向由 入门级 参数指定的目录条目。 |
返回值
| 项 | 描述 |
|---|---|
| 重大安全事件数量 | 指示子例程已成功。 |
| 9 | 指示子例程不成功,或者已到达目录末尾。 如果用户在执行进程之前设置了环境变量 XPG_SUS_ENV=ON ,那么当超过进程的文件大小限制时,将向进程发布 SIGXFSZ 信号,并且子例程将始终成功。 |
错误代码
如果 readdir_r 子例程不成功,那么 errno 全局变量将设置为下列其中一个值:
| 项 | 描述 |
|---|---|
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;