2010-11-09 61 views
2

我有这样的代码:C:与nftw()奇怪的行为

#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

什么是/ home/pf目录上的保护?这控制着你所看到的,而不是.gvfs目录本身的权限掩码。 – 2010-11-09 11:06:00

+2

顺便说一句,你不需要给C字符串自己添加'\\ 0'。 – Hasturkun 2010-11-09 11:26:04

+0

相关提示@Hasturkun。谢谢你的提示! (我是C新手) – 2010-11-09 11:44:12

回答

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; 
} 
+2

我也会在类型标记检查 – Hasturkun 2010-11-09 11:28:48

+0

+1中添加'FTW_DNR'作为注释,使用像stat这样的东西,你应该尽可能多地捕捉错误,并且阅读文档... – steabert 2010-11-09 11:33:37

+0

感谢FTW_DNR提示,@Hasturkun。这将是有用的。谢谢@steabert明确的答案,我错过了类型标志论证的重要性。 – 2010-11-09 11:45:29