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;
DIR * DirectoryPointer;
struct dirent * Entry;
struct dirent ** Result;
描述
readdir_r子程序返回结果参数指向的结构中的目录条目。 readdir_r子程序会返回 .NET 文件的条目。 (点)和 .. (点-点)目录(如果存在),但绝不会返回无效条目(用d_ino设置为 "0)。 当到达目录末尾时,"readdir_r子程序返回 "9,并将结果参数设置为 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 | 当_POSIX_NO_TRUNC变量有效时,DirectoryPointer参数的长度超过了PATH_MAX变量的值,或者路径名组件的长度超过了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;