2016-06-27 11 views
0

ich einen Daemon (läuft auf Ubuntu Server 16.04, kompiliert mit g++ -std=c++11), die auf zwei Funktionen vertraut wissen, ob ein Verzeichnis existiert und wenn es leer:DIR Funktionen falsch nach ein paar Tagen der Rückkehr

bool DirectoryExists (const char* path) { 
    if(path == NULL) return false; 
    DIR *d; 
    d = opendir(path); 
    if (d){ 
     closedir(d); 
     return true; 
    } 
    return false; 
} 

bool isEmpty(const char* path) { 
    int n = 0; 
    //Directory scan 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir(path); 
    if (d){ 
     while ((dir = readdir(d)) != NULL){ 
      if(dir->d_name[0] == '.')continue; 
      if(++n > 0) break; 
     } 
     closedir(d); 
    } 
    else{ 
     return false; 
    } 
    if (n == 0) //Directory Empty 
     return true; 
    else 
     return false; 
} 

Die Problem ist, dass nach einem oder zwei Tagen der Dämon arbeiten diese Funktionen ständig FALSE (beide) zurück, wenn sie TRUE zurückgeben sollten. Ich habe den Verdacht, dass der Zeiger DIR * nicht korrekt schließt, aber ich konnte es nicht beheben.

Was mache ich hier falsch?

EDIT:

In einigen Teilen von meinem Code, ich verwende DirectoryExists zu überprüfen, ob ein Verzeichnis entfernt tatsächlich verschwunden ist, oder wenn es immer noch da. Wenn diese Überprüfung abgeschlossen ist, wird errno auf "Keine solche Datei oder Verzeichnis" festgelegt, das ist richtig, aber ich weiß nicht, ob das die Quelle meines Problems sein könnte.

system("rm -rf " + fullpath); 
if(DirectoryExists(std::string(fullpath).c_str())){ 
    syslog(LOG_ERR, "ERROR: Directory %s couldn't be removed", fullpath.c_str()); 
    return false; 
} 

EDIT 2:

Wie ich vermutete, wenn diese Funktionen beginnt sie nicht die errno wird auf „zu viele offene Dateien“

+0

Sind Sie sicher, dass dies die Funktionen mit dem Problem sind? Sie sehen ziemlich wasserdicht aus, aber möglicherweise, wenn etwas anderswo schief geht, wird es zuerst durch diese Funktion hervorgehoben. Wie wäre es mit errno lesen, um zu sehen, was der eigentliche Fehler ist. Siehe http://pubs.opengroup.org/onlinepubs/7908799/xsh/readdir.html zum Beispiel Code – Neil

+0

Nicht sicher, warum ist dies markiert C++ 11. Es gibt keine einzige C++ 11-Funktion, die in dem veröffentlichten Code verwendet wird. In der Tat ist dieser Code pure C. –

+0

Dies sind die einzigen Funktionen im gesamten Code, die opendir() verwenden, ich werde errno zu Syslog-Ausgabe hinzufügen, aber es wird zwei Tage dauern, um nützliche Ausgabe zu machen. – Arheisel

Antwort

1

Meine Vermutung der säumige Linie wäre, ist das ein enthält std::string(fullpath).c_str():

if(DirectoryExists(std::string(fullpath).c_str())) { 
    ... 
} 

Sie eine temporäre verwenden, die vor der Funktion zerstört wird, selbst eingeben s. Glücklicherweise scheint der Speicher, auf den c_str() zeigt, die gewünschte Zeichenfolge zu enthalten, aber irgendwann hört dies auf zu sein (vielleicht aufgrund der Speicherfragmentierung, die den Druck auf den Speicherzuordner erhöht, Speicher wiederzuverwenden).

+0

ersetzt habe. Ich werde das dann korrigieren und Ergebnisse veröffentlichen – Arheisel

Verwandte Themen