4

语境:

readdir_r函数用于从 a 读取下一个条目DIR*(还有readdir,但这不是线程安全的)。readdir_r接受一个指向用户分配缓冲区的指针来保存输出dirent。手册页指出此缓冲区所需的大小在不同系统上可能不同,并提供了如何在运行时找到安全长度的示例:

len = offsetof(struct dirent, d_name) + pathconf(dirpath, _PC_NAME_MAX) + 1;

(警告:上面有一个竞争条件,可以通过使用dirfd获取打开的文件描述符DIR*并使用fpathconf而不是来避免pathconf

问题:

查看联机帮助页pathconf,它指出:

_PC_NAME_MAX 返回允许进程创建的目录路径或 fd 中文件名的最大长度。对应的宏是_POSIX_NAME_MAX。

但是,在注释部分中,它指出:

名称长度长于名称等于 _PC_NAME_MAX 的返回值的文件可能存在于给定目录中。

这个注释是真的吗?如果是这样,readdir_r手册页中的示例代码是否不正确?

4

1 回答 1

3

对 {NAME_MAX} 的解释不符合 POSIX。POSIX 表示,实现必须将长于 {NAME_MAX} 的名称视为错误,并且d_name{NAME_MAX}+1 字节的缓冲区就足够了。

另一种选择(POSIX.1-2008)是使用scandir()线程安全的,并从调用者那里抽象出这个问题。不幸的是,没有scandirat()fscandir()在任何版本的 POSIX 中。

readdir()在许多系统上,只要对返回的最后一次访问struct dirent发生在下一次调用之前readdir()(这遵循对结构有效性的现有要求),使用它也是安全的。我认为 POSIX 没有理由不允许这样做。readdir_r()需要相当多的额外代码,这会使事情变得更慢和更复杂。

于 2013-04-06T23:10:33.157 回答