2009-07-27 6 views
1

Ich habe einen langen laufenden Prozess, der das System überwacht und periodische Protokolle druckt. Wenn ich es länger als 10-15 Minuten laufen lasse, wird es mit einer Nachricht beendet, die sagt: Zu viele geöffnete Akten.Die Anzahl der Dateideskriptoren in Linux erhöhen

Das Programm wird mit Echtzeit timer_create() und timer_settime() eingerichtet, die alle 2 Sekunden eine SIGUSR1 auslösen. Im Handler gibt es ein fork() - exec() in child Es gibt eine Wartezeit in der übergeordneten und nachfolgenden mmap() und stream-Operationen auf/proc/acpi/battery/state und/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq und scaling_setspeed Dateien. Ich habe darauf geachtet, die Stream FILE * Zeiger im periodischen Signalhandler und an allen anderen Stellen zu schließen. Ich habe auch munmap() aller gemappten Dateien sichergestellt.

Wie kann ich das umgehen? Sollte ich die maximale Anzahl der erlaubten Dateideskriptoren erhöhen oder sollte ich die maximale Anzahl der von ulimit -aS angezeigten Dateien erhöhen? Warum passiert das, wenn ich die ganze FILE * mit fclose() schließe?

Hier sind die Werte für mein System ab sofort:

#cat /proc/sys/fs/file-max 
152808 

#ulimit -aS 
. 
. 
. 
. 
open files (-n) 1024 
+1

Sie lecken irgendwo irgendwo. – Joe

+0

Wie ich unten erwähnt habe, habe ich keinen Streamzeiger der Dateien korrekt geschlossen. Ich kam zurück, bevor die fclose() aufgerufen wurde, etwa so: if (freq == "1000000") return 0; sonst if (freq == "1333000") zurück 1; sonst if (freq == "1667000") zurück 2; fclose (fp); Ich fclose vor den if-else-Anweisungen und es wurde behoben. – Dhruv

Antwort

3

Verwenden lsof oder ein Debugger zu finden, welche Dateien Ihr Prozess geöffnet hat. Wenn Sie das Limit erhöhen, wird der Zeitpunkt, zu dem Sie keine Deskriptoren mehr haben, verzögert.

+0

Danke. Ich habe die Datei/sys/devices/system/cpu/cpu0/cpufreq/scaling_setup nicht geschlossen. Dies wurde durch Ausführen von lsof + p klar gezeigt. – Dhruv