[在基于x64的Ubuntu 19.10主机上执行的基于arm32的容器中的C程序中调用readdir函数时,该调用为空目录(例如/ mnt,/ media)返回EOVERFLOW,而不是返回0。
其他人是否注意到了这个问题?这是配置问题吗?如果是这样,如何解决?
版本:
复制步骤:
#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编号不适合,则readdir
,stat
等将以EOVERFLOW
失败。在32位。许多现代文件系统始终具有不适合32位的inode编号。