pathconf(...,_PC_NAME_MAX)提供什么保证?

时间:2012-09-20 17:53:40

标签: posix readdir

上下文

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

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

(警告:上面有竞争条件,使用dirfd获取已打开的DIR*的文件描述符并使用fpathconf代替{{} { 1}})

问题:

查看pathconf的联机帮助页,它声明:

  

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

但是,在备注部分,它指出:

  

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

这个说明是真的吗?如果是这样,pathconf手册页中的示例代码是否不正确?

1 个答案:

答案 0 :(得分:2)

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

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

在许多系统上,只要最后一次访问返回的readdir(),就可以安全地使用struct dirent - 在下一次调用readdir()之前(从现有的readdir_r()开始对结构有效性的要求)。我认为POSIX没有理由不允许这样做。 {{1}}需要相当多的额外代码,这使得事情变得更慢,更复杂。