Endlosschleife
-
Hallo Leutz!
Schreibe grade ein tolles Programm, das unter Linux als Diesnt laufen soll.
Es soll nichts weiter tun, als nur in einem bestimmten Ordner z.B. "/ein/pfad" jede 5 Sekunden nach Dateien suchen und beim Vorhandensein eine bestimmte Aktion starten. Anschliessend werden die gefundenen Files aus dem Ordner verschoben.Es läuft alles wunderbar! Nur nach ca 2-2,5 Studnen hört die Endlosschleife auf zu laufen.
Ob jemand von euch eine Idee hat, an was es liegen könnte?
Danke für eure Tipps.
int main (void) { int ret; DIR *dir; struct dirent *dirzeiger; for (;;) { if((dir=opendir("/ein/pfad")) != NULL) { while((dirzeiger=readdir(dir)) != NULL) { if(memcmp((*dirzeiger).d_name, ".", sizeof("."))==0 || memcmp((*dirzeiger).d_name, "..", sizeof(".."))==0) continue; // tue was!! break; } } sleep(REFRESH_TIME); } return 0; }
-
vll. ist ein speicherloch drin.
(dir=opendir("/ein/pfad")
(dirzeiger=readdir(dir))diese beiden befehle geben zeiger zurück.
Wann werden die wieder freigegeben?Gibt es Fehlermeldungen?
//EDIT:
closedir(dir)
solltest du einbauen.den Dirzeiger brauchste dagegen nicht wieder freigeben,
scheint nur ein zeiger auf ein struct in "dir" zu sein.
-
uups
,
so wie es aussieht, wird gar nicht freigegeben...
Wie mache ich das in "c"?Fehlermeldungen habe ich noch keine entdeckt.
Was passiert denn? Speicher voll?
Danke.
-
Wäre es nicht sinnvoller cron zu verwenden?
Da haste zwar nur eine genauigkeit von 1 min.
aber du solltest dir doch überlegen ob das nicht ausreicht.
-
ja, habe ich schon nachgedacht.
Geplant war zunächst ein Echtzeitbetrieb aufzuziehen.
Die Eingehenden Files sollen sofort abgearbeitet werden.Doch die Lösung mit dem Echtzeitbetrieb erschien mir etwas zu aufwändig.
Mit einer Minute Takt wäre das System viel zu träge.Deshalb habe ich mich zur der o.b. Lösung entschlossen.
Könnte ich in Bash schreiben, doch ist die C-Lösung nicht Resourcen-sparender?Danke
-
http://www-128.ibm.com/developerworks/linux/library/l-inotify.html
http://www.edoceo.com/creo/inotify/perl-inotify.php
Braucht inotify im Kernel. Das ist soweit ich weis bei den grossen Binär Distris Standard.
-
Danke für die Beiträge.
Ich habe den Sourcecode angepasst und neu kompiliert. Jetzt läuft das Programm ohne Unterbrechungen.Mit dem Thema "inotify" werde ich mich zu einem späteren Zeitpunkt beschäftigen. Scheint interessant zu sein.
Besten Dank.
-
Eine weitere Alternative zu INotify ist FAM http://oss.sgi.com/projects/fam/faq.html.
Das braucht einen Daemon (famd/gamin), der sollte aber eigentlich auf jedem aktuellen Linux System laufen, weil KDE/Gnome den auch brauchen.
-
Apropos Endlosschleife:
Wusstet Ihr schon, dass der neue IBM Cell-Prozessor so schnell ist, dass er für eine Endlosschleife nur 28 Sekunden braucht?
-
ist zwar etwas spät (ich habe den thread mit google gefunden), aber was solls.
die funktion memcpy(char* to, const char* from, size_t size) ist recht riskant.
du machst ja keine abfrage, wie viel speicher an dem to-pointer reserviert wurde. wenn dort nur 1 byte speicher allokiert ist, und du schreibst 2 byte rein, dann stürzt dein programm irgentwann ab, weil du unbeabsichtigt anderen speicher überschreibst (der dahinter allokiert ist), was letztendlich irgentwo einen fehler verursacht.
-
Mir ist auch folgendes aufgefallen:
sizeof(".") ist völlig falsch, du meinst strlen(".")
Du vergleichst nämlich 3 Bytes zu viel und was hinter "." == {'.', '\0'} steht ist undefiniert.
-
Hi,
wenn du das Ding ständig als "Service" laufen lassen willst, solltest du es als Daemon designen. Kannst dir ja mal das Beispiel unter:
http://www.zotteljedi.de/doc/socket-tipps/code_daemon.html
anschauen.Have fun.
-
Martin G schrieb:
Apropos Endlosschleife:
Wusstet Ihr schon, dass der neue IBM Cell-Prozessor so schnell ist, dass er für eine Endlosschleife nur 28 Sekunden braucht?Brennt der nach 28 Sekunden Volllast ab, oder wie macht er das?