2010-11-09 62 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