Segmentation Fault, fopen (Linux, C)
-
Mein Programm zum Verzeichnis-Listing funktioniert soweit, nur die Dateigrößen würde ich gerne noch anhängen.
Variablen:
struct dirent *dirInfo // enthält Informationen über das betroffene Verzeichnis FILE *list // Pointer zu der Datei, in der alle Pfade gespeichert werden FILE *currentFile // Pointer zur Datei, deren Größe ermittelt werden soll long int fileSize // Dateigröße char subDir[256]; // Dateipfad
Fehlerhafter Code:
if(dirInfo->d_type != 4) // Wenn sich hinter dem Pfad kein Verzeichnis { // sondern eine tatsächlich Datei befindet currentFile = fopen(subDir, "a+b"); // Datei öffnen fseek(currentFile, 0, SEEK_END); // Zu Dateiende springen fileSize = ftell(currentFile); // Dateilänge ermitteln fclose(currentFile); // Datei schließen }
"list" ist die ganze Zeit geöffnet.
Woher kommt der Fehler? Das Programm scheint an der Stelle mit der Ausführung schlicht zu stoppen, obwohl subDir einen gültigen Dateipfad enthält.
Ich habe darüber hinaus beobachtet, dass das Programm scheinbar ungültige Dateien öffnet, die nicht existieren (es tauchen neue, leere Dateien mit fehlerhaft kodieren Namen auf).An einer spätern Stelle im Code die prinzipiell das selbe macht funktioniert das Ganze.
-
Falsches Forum ...
Wenn etwas nicht funktioniert, würde ich als erstes mit gdb den genauen Ursprung feststellen (hier kannst du mittels print subDir prüfen, ob der Pfad wirklich korrekt ist).
Wenn du genauere Informationen hast, können wir dir dann helfen, weil dass es prinzipiell funktioniert hast du ja schon selber herausgefunden.Ansonsten: Wenn du nicht Systemunabhängig sein willst, kannst du das gleiche mit man: stat(2) etwas effizienter erledigen.
-
Das hab ich als als Erstes geprüft.
./frs.o
Scheint mir ein gültiger Pfad zu sein, wenn sich die Quelle des ausführenden Programms im selben Verzeichnis befindet.
Selber Fehler mit stat, fstat, etc.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
currentFile = fopen(subDir, "a+b"); // Datei öffnen
"a+b"? "a+" ist schonmal schlecht, das ist doch der Modus mit "append and create if missing", oder?
Benutze zur Ermittlung der Dateigröße lieber man: stat(2), das ist günstiger. Und mach aus den Pfaden absolute Pfade, zB. mit man: realpath(3).
-
Warum auch immer, funktioniert der selbe Code inzwischen - aber nicht mit absoluten Pfaden. Wenn subdir sagen wir: "home/user" ist habe ich wieder den selben unschönen Speicherfehler.
-
Jag das mal durch den GDB, dann weißt Du mehr.
-
Längst getan; es ist der selbe Fehler.
-
Vven schrieb:
Längst getan; es ist der selbe Fehler.
Und zwar? Wo segfaultet Dein Programm?
-
Bei einem Aufruf von readdir(), ich würde fast vermuten dass die Funktion einen NULL-Pointer übergeben bekommt, dann wüsste ich aber nicht warum. Der dann müsste der Auruf von opendir() fehlschlagen, was nicht sein kann da /home ein gültiger Pfad ist.
-
Gratulation, Du hast gerade entdeckt, warum man immer alle Rückgabewerte überprüfen sollte und wofür man man: perror(3) braucht.