2013-05-30 6 views
0
DIR *dir_ptr; 
struct dirent *dir_entery; 
dir_ptr = opendir("/tmp"); 

while (dir_ptr&&(dir_entery = readdir(dir_ptr))) { 
    printf("%s \n", dir_entery->d_name); 
} 

printf("%s \n", strerror(errno)); 

дает этот вывод:Почему READDIR возвращает нуль и ошибка ввода/вывода на следующий вызов READDIR после первого вызова на каталоге

file_name 
dir_name 
errno = Remote I/O error 

в /tmp Я один реже и два файла, когда прибудет READDIR после выполнения opendir(dir) он покидает время и поставить эту ошибку:

errno = Remote I/O error 

Почему не удается прочитать файл после директории в каталоге /tmp?

+1

внимательно изучите инструкцию http://linux.die.net/man/3/readdir – akhil

+0

errno 121 является «EREMOTEIO» (ошибка удаленного ввода-вывода). Возможно, есть проблемы с правами на целевую файловую систему. Вы пытались запустить свою программу с правами пользователя root (supper user), если вы работаете в Ubuntu с помощью 'sudo' –

+0

Я бы предположил, что второй файл имеет необычные атрибуты, имя, права доступа и т. Д. Попробуйте запустить в нижней директории , Может быть, это задыхается от «..»? – chux

ответ

0

readdir() не задокументировано, чтобы вернуть REREMOTEIO, поэтому, скорее всего, sterror() дает вводящую в заблуждение информацию.

Комплект errno до 0 перед тем, как идти в петлю while().

От man readdir:

If the end of the directory stream is reached, NULL is returned and errno is not changed. If an error occurs, NULL is returned and errno is set appropriately. If an error occurs, NULL is returned and errno is set appropriately.

Чтобы проверить эти два случая, когда readdir() возвращает NULL вы можете мода ваш код так:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 

    ... 

    DIR * dir_ptr = opendir("/tmp"); 
    if (!dir_ptr) 
    { 
    perror("opendir() failed"); 
    } 
    else 
    { 
    struct dirent * dir_entery = NULL; 

    errno = 0, 
    while (dir_entery = readdir(dir_ptr)) 
    { 
     printf("%s\n", dir_entery->d_name); 
    } 

    if (errno) 
    { 
     perror("readdir() failed"); 
    } 
    else 
    { 
     printf("No more entries.\n"); 
    } 
    } 

    ...