gpt4 book ai didi

c - 在基于arm32镜像的容器中,当目录为空时,readdir返回EOVERFLOW

转载 作者:行者123 更新时间:2023-12-02 18:34:23 25 4
gpt4 key购买 nike

在基于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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com