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“
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
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. –
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