2

我有这个代码:

#include <ftw.h>
#include <stdio.h>
#include <string.h>

int nftw_stat(const char *path, const struct stat *stat, int flags,
              struct FTW *ftw)
{
    if (strcmp(path, "/home/pf/.gvfs\0") == 0) {
        printf("nftw()\n");
        printf("mode = %d\n", stat->st_mode);
        printf("size = %d\n", (int) stat->st_size);
    }

    return 0;
}

int main()
{
    if (nftw("/home/pf", &nftw_stat, 1, FTW_PHYS)) {
        perror("nftw");
        return 2;
    }
}

如果我正常执行它,它返回的方式与 stat() 函数相同:

模式 = 16704 (S_IFDIR | S_IRUSR | S_IXUSR)
大小 = 0

但是当我用 执行它时sudo,它会返回:

模式 = 16832 (S_IFDIR | S_IRWXU)
大小 = 4096

怎么了?如果我使用stat()sudo给我Permission denied错误。这只发生在.gvfs目录,其权限为 500 (dr-x------)。如果sudo无法阅读stat(),为什么它可以使用nftw()?:|

4

1 回答 1

3

可能发生的情况是目录上的 stat 失败,但是无论如何您都在打印 stat 结构的值,这意味着您得到了垃圾。您需要检查 typeflag 的值,您在 nftw_stat 例程中将其称为“flags”,以确保 stat 已成功设置 stat 结构。

int nftw_stat(const char *path, const struct stat *stat, int typeflag,
          struct FTW *ftw)
{
  if (typeflag == FTW_NS) {
    printf("stat failed on %s\n", path);
    return 1;
  }
  if (strcmp(path, "/home/pf/.gvfs\0") == 0) {
    printf("nftw()\n");
    printf("mode = %d\n", stat->st_mode);
    printf("size = %d\n", (int) stat->st_size);
  }
  return 0;
}
于 2010-11-09T11:12:53.590 回答