Ich versuche, alten alten Code auf neuen 64-Bit-Systemen zu arbeiten, und ich bin derzeit fest. Unten ist eine kleine C-Datei, die ich verwende, um Funktionalität zu testen, die in dem aktuellen Programm vorhanden ist, das derzeit unterbrochen wird.readdir() 32/64 Kompatibilitätsprobleme
#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);
}
}
Das Problem:
Das OS ist Red Hat 7.0 Maipo x86_64. Der Legacy-Code ist 32-Bit und muss so beibehalten werden.
Ich habe die Kompilierung für das Programm funktioniert gut mit dem -m32
Flag mit g++
. Das Problem, das auftritt, ist während der Laufzeit, readdir()
bekommt einen 64-Bit Inode und wirft dann einen EOVERFLOW errno und natürlich wird nichts ausgedruckt.
Ich habe versucht mit readdir64()
anstelle von readdir()
zu etwas Erfolg. Ich erhalte den Fehler EOVERFLOW nicht mehr, und die Zeilen werden auf dem Terminal ausgegeben, aber die Dateien selbst werden nicht gedruckt. Ich gehe davon aus, dass der Puffer nicht das ist, was dirent
erwartet.
Ich habe versucht dirent64
zu verwenden, um zu versuchen, dieses Problem zu lindern, aber wenn ich das versuche ich bekommen:
test.c:19:22 error: dereferencing pointer to incomplete type
printf(" %s\n", dp->d_name);
Ich frage mich, ob ein Weg, es manuell die dp->d_name
Puffer verschieben für dirent
zu sein verwendet mit readdir()
. Ich habe in Gdb festgestellt, dass mit readdir()
und dirent
Ergebnisse in dp->d_name
mit Verzeichnissen bei dp->d_name[1]
gelisteten, während readdir64()
und dirent
gibt das erste Verzeichnis unter dp->d_name[8]
.
Das oder irgendwie dirent64
zu arbeiten, oder vielleicht bin ich nur auf dem falschen Weg vollständig.
Schließlich ist es erwähnenswert, dass das Programm einwandfrei funktioniert, ohne das -m32
Flag enthalten, also nehme ich an, es muss irgendwo ein 32/64 Kompatibilitätsfehler sein. Jede Hilfe wird geschätzt.
Warum definieren Sie nicht einfach den fehlenden Typ und verwenden Sie dirent64? – Martin
Du meinst definiere dirent64 genau so, wie es in dirent.h nur in meinem Programm definiert ist? – PKFiyah
Das ...funktionierte perfekt, nachdem ich die Struktur aus Bits/dirent.h herausgezerrt habe und sie einfach manuell in meinen Code eingefügt habe. Ich bin sicher, dass es irgendwo eine Definition gibt, die wahrscheinlich verwendet werden kann, aber das funktioniert jetzt. Vielen Dank! – PKFiyah