0

像这样使用 nftw 遍历目录时,

nftw((argc < 2) ? "." : argv[1], rm, 20, FTW_DEPTH|FTW_PHYS)

nftw 在遇到目录时将值 5 传递给 rm 函数的 tflag 参数。ftw.h 标头只为 tflag 参数指定了一个具有 4 个值 (0-3) 的枚举,其中 FTW_D 或 1 是目录的适当值。fpath 值似乎在所有情况下都是正确的。

所以我的问题是这个。为什么它为 tflag 传递 5 而不是 1,而 5 对 tflag 意味着什么?

编辑:

该值实际上是 FTW_DP(目录,已访问所有子目录),它在下面的环境相关部分中定义,我没有注意到。

4

1 回答 1

2

的 POSIX 规范nftw() 说,你的rm函数的标志参数应该是以下之一:

  • FTW_D 对象是一个目录。
  • FTW_DNR 对象是无法读取的目录。不应为其任何后代调用 fn 函数。
  • FTW_DP 该对象是一个目录,并且子目录已被访问。(仅当 FTW_DEPTH 标志包含在标志中时才会出现这种情况。)
  • FTW_F 该对象是一个非目录文件。
  • FTW_NS 由于缺少适当的权限,对象上的 stat() 函数失败。传递给 fn 的统计缓冲区未定义。由于任何其他原因导致 stat() 失败被视为错误,并且 nftw() 应返回 -1。
  • FTW_SL 该对象是一个符号链接。(仅当 FTW_PHYS 标志包含在标志中时才会出现这种情况。)
  • FTW_SLN 该对象是一个不命名现有文件的符号链接。(仅当 FTW_PHYS 标志不包含在标志中时才会出现这种情况。)

由于您没有识别您的系统并且标准没有定义与被调用函数的标志参数相关联的数字,因此没有人可以识别5您系统上的含义。但是,有足够多的选项5似乎并不令人难以置信。

在 Mac OS X (10.9.5) 上,该5值为FTW_SL. 在另一个基于 OSF 的系统上,jedwards评论中指出该值5是 for FTW_DP,因此完全证明了我的观察,即由 表示的标志5是系统相关的。

于 2014-09-26T14:07:32.940 回答