【问题标题】:Why readdir returns null and I/O error the next call to readdir after first call on a directory为什么 readdir 在第一次调用目录后在下一次调用 readdir 时返回 null 和 I/O 错误
【发布时间】:2013-05-30 16:39:23
【问题描述】:
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目录下的dir之后的文件?

【问题讨论】:

  • 仔细阅读手册linux.die.net/man/3/readdir
  • errno 121 是 EREMOTEIO(远程 I/O 错误)。目标文件系统可能存在权限问题。您是否尝试过以 root(超级用户)权限运行您的程序,如果您在 Ubuntu 中,请尝试使用 sudo
  • 我会假设第二个文件具有不寻常的属性、名称、访问权限等。尝试在较低的目录中运行。也许它在“..”上窒息?
  • 我chmod /tmp: chmod -R 0777 /tmp中的所有文件
  • ls -la /tmp 的输出是什么?如果需要保密,请隐藏实际文件名。

标签: c linux readdir


【解决方案1】:

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

errno设置为0before进入while()循环,即before调用readdir()

来自man readdir

如果到达目录流的末尾,则返回 NULL 并且 errno 不是 改变了。如果发生错误,则返回 NULL 并适当设置 errno。区分流的结尾和 错误,在调用 readdir() 之前将 errno 设置为零,然后检查 如果返回 NULL,则为 errno 的值。

要在readdir() 返回NULL 时测试这两个 情况,您可能需要像这样修改您的代码:

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

  ...

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

    errno = 0; 
    while ((dir_entery = readdir(dir_ptr))) /* an extra pair of parenthesis here to silence GCC */
    {
      printf("%s\n", dir_entery->d_name);
    }

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

  ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2016-12-08
    • 2018-09-20
    • 2022-01-11
    • 2012-02-27
    • 2018-09-25
    • 2020-08-19
    相关资源
    最近更新 更多