我有这段代码:
#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()函数相同:
mode = 16704 (S_IFDIR | S_IRUSR | S_IXUSR) size = 0
但是当我用sudo
执行它时,它会返回:
mode = 16832 (S_IFDIR | S_IRWXU) size = 4096
会发生什么?如果我将stat()
与sudo
一起使用,则会向我提供权限被拒绝错误。这只发生在.gvfs
目录下,其权限为500(dr-x ------)。如果使用sudo
无法读取stat()
,为什么它适用于nftw()
? :|
答案 0 :(得分: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;
}