在基于arm32图像的容器中,目录为空时readdir返回EOVERFLOW

问题描述 投票:1回答:1

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

其他人是否注意到了这个问题?这是配置问题吗?如果是这样,如何解决?

版本:

  • 来宾: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脚本,基于Debian Buster为arm32构建名为crystal-for-buster-armhf:v1的图像,并使用here脚本。
  • 基于该图像启动容器。
  • 编译并构建以下程序。
  • 使用目录名作为命令行参数来执行生成的可执行文件。
#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);
  }
}
c linux docker arm
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.