2017-05-17 7 views
2

Also nur um zu klären. Dies ist für eine Schulaufgabe. Wir schreiben ein vereinfachtes Suchprogramm (sfind) und ich stoße auf ein Problem.Seg Fehler beim Schreiben meines eigenen Suchprogramms

Grundsätzlich funktioniert das Flag -print perfekt in jeder Situation, in der es nicht viel zu sehen gibt. Wenn ich jedoch versuche, es aus meinem Basisverzeichnis (mit einer großen Anzahl von Dateien) zu starten, stoße ich schließlich auf seg-Fehler. Ich denke, das könnte aus einer Reihe von Gründen sein.

  1. Mein Benutzerprozessgrenze zu niedrig
  2. Meine maximale Dateigröße zu niedrig ist
  3. ich Stack-Überlauf für zu tief Rekursion bin immer
  4. Einige andere Sache, die ich
bin mit Blick auf

Ich führe dies auf Ubuntu, und es wird auf einem Unix-Server möglicherweise zurückgegeben werden.

Hier ist mein aktueller Rekursionscode. Hier

int printHelper(struct dirent *entry, DIR *dir, char* path){ 
    struct stat fileStat; 
    DIR *tempDir; 
    char tempPath[1000]; 
    char const* name = entry->d_name; 
    strcpy(tempPath, path); 
    strcat(tempPath, name); 
    lstat(tempPath, &fileStat); 
    if(strcmp(name, ".") != 0 && strcmp(name, "..") != 0){ 
     printf("%s%s\n", path, name); 
    } 
    if((S_ISDIR(fileStat.st_mode)) && (strcmp(name, ".") != 0) && (strcmp(name, "..") != 0)){ 
     struct dirent *tempEntr; 
     char newTempPath[1000]; 
     char newPathName[1000]; 
     strcpy(newPathName, name); 
     strcpy(newTempPath, path); 
     strcat(newTempPath, newPathName); 
     strcat(newTempPath, slashPath); 
     tempDir = opendir(newTempPath); 
     tempEntr = readdir(tempDir); 
     printHelper(tempEntr, tempDir, newTempPath); 
     closedir(tempDir); 
    } 
    if(!(entry = readdir(dir))){ 
      return 0; 
    } 
    printHelper(entry, dir, path); 
    return 0; 
} 

ist der Anfang der Datei

#include <sys/stat.h> 
#include <sys/resource.h> 
#include <sys/time.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <stdio.h> 
#include <string.h> 
#include "myPrint.h" 

char slashPath[3] = "/\0"; 

int myPrint(char const* myFile){ 
    DIR *dir; 
    struct dirent *entry; 

    int isDir; 
    isDir = 1; 

    if (!(dir = opendir(myFile))){ 
     isDir = 0; 
    } 
    else if (!(entry = readdir(dir))){ 
     return -1; 
    } 
    if(isDir == 0){ 
     dir = opendir("."); 
     while((entry = readdir(dir))){ 
      if(strcmp(myFile, entry->d_name) == 0){ 
       printf("%s\n", myFile); 
       return 0; 
      } 
     } 
     printf("find: ‘%s’: No such file or directory\n", myFile); 
     return 0; 
    } 
    else{ 
     char path[2000]; 
     strcpy(path, myFile); 
     strcat(path, slashPath); 
     printf("%s\n", myFile); 
     printHelper(entry, dir, path); 
     return 0; 
    } 
    return 0; 
} 
+0

weil Sie keinen Basisfall haben –

+0

Könnten Sie ein wenig klären? Weil es mehr im Code gibt. Ich werde es in – Joe

+0

Zeit bearbeiten, um den Debugger zu verwenden. – Olaf

Antwort

0

Sie haben einen rekursiven Aufruf für jede Datei, die Sie verarbeiten. Der Call-Stack wird sehr schnell und Sie werden den Stack überlaufen.

Ändern Sie den Code so, dass er für jedes Verzeichnis statt für jede Datei rekursiv ist. Lassen Sie die Funktion nur einen Verzeichnispfad akzeptieren. Öffnen Sie dann das Verzeichnis und verwenden Sie eine while Schleife, um jeden Eintrag zu durchlaufen. Wenn der Eintrag ein Verzeichnis ist, dann einen rekursiven Aufruf mit dem Namen des Unterverzeichnisses.

+0

Ah, so meinst du, am Ende, wenn ich print Helfer auf sich selbst mit all den gleichen Sachen, die es ursprünglich genannt wurde nennen, machen Sie stattdessen, dass eine While-Schleife? Ich denke, das macht Sinn – Joe

+0

@Joe Nicht nur das Ende. Starten Sie die Funktion, indem Sie 'opendir' aufrufen, und verwenden Sie dann' while ((entry = readdir (dir))! = NULL) 'die gelesenen Einträge, dann' closedir' am Ende. – dbush

+0

Ja, ich habe das jetzt. Vielen Dank. Ich war ernsthaft ratlos. – Joe

Verwandte Themen