2010-11-09 2 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; 
    } 
} 

Если я исполню это нормально, она возвращает так же, как функция стата():

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. –

+2

Кстати, вам не нужно добавлять '\\ 0' в строки C самостоятельно. – Hasturkun

+0

Полезно знать @Hasturkun. Спасибо за совет! (Я новичок в C) –

ответ

3

Что, вероятно, происходит из-за того, что stat не удалось найти в каталоге, но вы печатаете значения структуры stat независимо от того, что вы получаете мусор. Вам нужно проверить значение typeflag, которое вы называете «флаги» в вашей процедуре nftw_stat, чтобы убедиться, что 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

Я также добавлю «FTW_DNR» к отметке typeflag – Hasturkun

+0

+1 для комментария, используя такие вещи, как stat, вы должны уловить как можно больше ошибок и прочитать документацию ... – steabert

+0

Спасибо за подсказку FTW_DNR, @Hasturkun. Это будет полезно. Спасибо @steabert за ясный ответ, я пропустил значение аргумента типаflag. –

Смежные вопросы