nftw传递未定义值的tflag

时间:2014-09-26 13:59:46

标签: c linux unix nftw

使用像这样的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,而tflag的5是什么意思?

编辑:

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

1 个答案:

答案 0 :(得分:2)

nftw()的POSIX规范 说你的rm函数的flag参数应该是:

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

由于您没有识别您的系统,并且标准没有定义与被调用函数的flag参数相关联的数字,因此没有人可以识别5对...的意义你的系统。但是,5有足够的选项似乎不可能作为一个值。

在Mac OS X(10.9.5)上,值5FTW_SL。在另一个系统上,基于OSF,jedwards中的comment注释5的值为FTW_DP,从而完全证明了我的观察结果{{1是系统相关的。