我正在尝试让一些旧的遗留代码在新的 64 位系统上运行,但目前陷入困境。下面是一个小 C 文件,我用它来测试当前正在中断的实际程序中存在的功能。
#define _POSIX_SOURCE
#include <dirent.h>
#include <sys/types.h>
#undef _POSIX_SOURCE
#include <stdio.h>
main(){
DIR *dirp;
struct dirent *dp;
char *const_dir;
const_dir = "/any/path/goes/here";
if(!(dirp = opendir(const_dir)))
perror("opendir() error");
else{
puts("contents of path:");
while(dp = readdir(dirp))
printf(" %s\n", dp->d_name);
closedir(dirp);
}
}
问题:
操作系统是Red Hat 7.0 Maipo x86_64。
遗留代码是 32 位的,并且必须保持这种方式。
我已经使用以下命令编译了程序,运行良好-m32
标志与g++
。出现的问题是在运行时,readdir()
获取一个 64 位 inode,然后抛出一个 EOVERFLOW errno,当然什么也不会打印出来。
我尝试过使用readdir64()
代替readdir()
取得一些成功。我不再收到 errno EOVERFLOW,并且这些行出现在终端上,但文件本身不会被打印。我假设这是由于缓冲区不是什么dirent
期望。
我尝试过使用dirent64
试图缓解这个问题,但每当我尝试这样做时,我都会得到:
test.c:19:22 error: dereferencing pointer to incomplete type
printf(" %s\n", dp->d_name);
我想知道是否有办法手动移动dp->d_name
缓冲区dirent
与使用readdir()
。我注意到在 Gdb 中使用readdir()
and dirent
结果是dp->d_name
目录列于dp->d_name[1]
, 然而readdir64()
and dirent
给出第一个目录dp->d_name[8]
.
那或以某种方式得到dirent64
去工作,或者也许我完全走在错误的道路上。
最后,值得注意的是,该程序在没有-m32
包含标志,所以我假设它一定是某个地方的 32/64 兼容性错误。任何帮助表示赞赏。