我正在尝试获得一些旧的64位 系统的旧旧代码,而且我现在已经被卡住了。 下面是一个小型C 文件,用于测试当前正在打断的实际程序中存在的功能。#define _POSIX_SOURCE
#include
#include
#undef _POSIX_SOURCE
#include
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(" %sn", dp->d_name);
closedir(dirp);
}
}
这个问题:
操作系统是红帽 7.0 Maipo x86_64. 遗留代码是 32位,必须以这种方式保持。
我已经使用 g++的-m32 标志,得到了程序工作正常的编译。 出现的问题是在运行时,readdir() 获取一个 64位 节点,然后抛出一个 EOVERFLOW errno,当然不会打印出任何内容。
我已经尝试使用 readdir64() 代替 readdir() 来取得一些成功。 我不再获得,EOVERFLOW,而且这些行出现在终端上,但是文件本身并没有打印出来。 这是由于缓冲区不是 dirent 所期望的。
我试着使用 dirent64 来缓解这里问题,但每当我尝试这里问题时,都会尝试:test.c:19:22 error: dereferencing pointer to incomplete type
printf(" %sn", dp->d_name);
不知道是否有一种方法可以手动将 dp->d_name 缓冲区转换为来与一起使用。 在Gdb中我注意到使使用 readdir() 和 dirent 会导致 dp->d_name 中列出的目录,而 readdir64() 和 dirent 则提供了在 dp->d_name[8] 中。
或者,或者让 dirent64 工作,或者我只是在完全错误的路径上。
最后,值得注意的是,没有包含 -m32 标志的程序函数,所以我认为它必须是 32个/64 兼容错误。 感谢你的帮助。