c语言程序存在兼容性问题,c readdir() 32/64 兼容性问题_file_开发99编程知识库

我正在尝试获得一些旧的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 兼容错误。 感谢你的帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值