readdir()32/64兼容性问题

PKF*_*yah 6 c 32-bit file dirent.h

我正试图让一些旧的遗留代码在新的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:

操作系统是Red Hat 7.0 Maipo x86_64.遗留代码是32位,必须保持这种方式.

我已经使用-m32带有标志的程序正常编译g++.出现的问题是在运行时,readdir()得到一个64位的inode,然后抛出一个EOVERFLOW错误,当然没有打印出来.

我试过用readdir64()它代替取得readdir()了一些成功.我不再获得errno EOVERFLOW,并且终端上出现了线条,但文件本身不会被打印出来.我假设这是由于缓冲区不是dirent预期的.

我试图用来dirent64试图缓解这个问题,但每当我尝试这个时,我得到:

test.c:19:22 error: dereferencing pointer to incomplete type 
  printf(" %s\n", dp->d_name);
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法手动移动dp->d_name缓冲区dirent以供使用readdir().我在GDB注意到,使用readdir()dirent在结果dp->d_name具有列出的目录dp->d_name[1],而readdir64()dirent给人的第一目录中dp->d_name[8].

那或者以某种方式开始dirent64工作,或者我可能完全走错了路.

最后,值得注意的是程序在没有-m32包含标志的情况下完美运行,所以我假设它必须是某个地方的32/64兼容性错误.任何帮助表示赞赏.

PKF*_*yah 1

感谢上面评论中的@Martin,我被引导尝试在我的代码中定义 dirent64 结构。这有效。可能有一个 #define 可用于避免将 libc .h 代码粘贴到我自己的代码中,但这目前有效。

我需要的代码可以在<bits/dirent.h>中找到

我想我还应该注意到,这使得它可以同时使用 readdir64() 和 dirent64

  • `dirent.h` 中的代码位于某些 `#define` 下,因此预处理器将其丢弃。为了启用“dirent.h”中的 64 位代码,必须定义一些编译标志。[此处](http://linux.die.net/man/7/feature_test_macros)页面建议“_FILE_OFFSET_BITS=64”。 (3认同)