为什么readdir在第一次调用目录后返回null并且I / O错误下一次调用readdir

时间:2013-05-30 16:39:23

标签: c linux readdir

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));

给出了这个输出:

file_name
dir_name
errno = Remote I/O error
/tmp中的

我在执行opendir(dir)之后获得readdir时有一个目录和两个文件它退出while并输出此错误:

errno = Remote I/O error

为什么它无法在/tmp目录中的目录后读取文件?

1 个答案:

答案 0 :(得分:0)

readdir()未记录为返回REREMOTEIO,因此很可能sterror()会提供误导性信息。

在进入errno循环之前,将0设置为while()

来自man readdir

  

如果到达目录流的末尾,则返回NULL并且errno   改变。如果发生错误,则返回NULL并正确设置errno。如果发生错误,   返回NULL并正确设置errno。

要在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");
    }
  }

  ...