在基于x64的Ubuntu 19.10主机上执行的基于arm32的容器中的C程序中在C程序中调用readdir函数后,该调用将为空目录(例如/mnt,/media)返回EOVERFLOW而不是返回0。

其他人有没有观察到这个问题?这是配置问题吗?如果是这样,如何解决?

版本:

  • guest :debian:buster- backports @ sha256:8f27850df2144df1598b5c76b213616ecaab08e804a6d84ddace1455d8cbd9f0
  • 主机:Ubuntu 19.10,amd64,Docker版本:19.03.6-0ubuntu1〜19.10.1
  • Qemu版本:1:4.0 + dfsg-0ubuntu9.6

  • 复制步骤:
  • 使用Dockerfile和build.sh脚本(可用here),基于Debian Buster为arm32构建名为crystal-for-buster-armhf:v1的镜像。
  • 基于此图像启动一个容器。
  • 编译并构建以下程序。
  • 使用目录名称作为命令行参数执行生成的可执行文件。

  • #define _POSIX_SOURCE
    #include <dirent.h>
    #include <errno.h>
    #include <sys/types.h>
    #undef _POSIX_SOURCE
    #include <stdio.h>
    
    main(int argc, char* argv[]) {
      DIR *dir;
      struct dirent *entry;
    
      if ((dir = opendir(argv[1])) == NULL)
        perror("opendir() error");
      else {
        puts("contents:");
        while (1) {
          errno = 0;
          entry = readdir(dir);
          if (entry == NULL) {
            printf("Errno: %d   EOVERFLOW: %d\n", errno, EOVERFLOW);
            break;
          }
          printf("  %s\n", entry->d_name);
        }
        closedir(dir);
      }
    }
    

    最佳答案

    如果您使用的是glibc(大多数基于Linux的系统),则需要使用-D_FILE_OFFSET_BITS=64进行编译。默认值仍然是32位off_t,并带有32位ino_t,并且在这种配置中,如果inode编号不适合32位,则readdirstat等将因EOVERFLOW而失败。许多现代文件系统始终具有不适合32位的inode编号。

    关于c - 在基于arm32镜像的容器中,当目录为空时,readdir返回EOVERFLOW,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62077669/

    10-11 18:52