2009-07-27 8 views
1

J'ai un long processus d'exécution qui surveille le système et imprime des journaux périodiques. Si je le laisse fonctionner pendant plus de 10-15 minutes, il se termine avec un message disant: Trop de fichiers ouverts.Augmentation du nombre de descripteurs de fichiers sous Linux

Le programme est configuré en utilisant timer_create() et timer_settime() en temps réel qui soulèvent un SIGUSR1 toutes les 2 secondes. Dans le gestionnaire, il y a un fork() - exec() dans l'enfant Il y a une attente dans le parent et les opérations suivantes mmap() et stream sur/proc/acpi/battery/state et/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq et les fichiers scaling_setspeed. J'ai pris soin de fermer les pointeurs FILE * du flux dans le gestionnaire de signal périodique et à tous les autres endroits. J'ai également assuré munmap() de tous les fichiers mappés.

Comment puis-je contourner le problème? Dois-je augmenter le nombre maximal de descripteurs de fichiers autorisés ou devrais-je augmenter le nombre maximal de fichiers ouverts affichés par ulimit -aS? Pourquoi cela se produit-il si je ferme tout le FICHIER * en utilisant fclose()?

Voici les valeurs de mon système à partir de maintenant:

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

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

Vous êtes définitivement fuyant quelque part. – Joe

+0

Comme je l'ai mentionné ci-dessous, je ne fermais pas correctement l'un des pointeurs de flux des fichiers. Je revenais avant que le fclose() a été appelé, quelque chose comme ceci: si (freq == "1000000") return 0; sinon if (freq == "1333000") return 1; sinon if (freq == "1667000") return 2; fclose (fp); Je place fclose avant les instructions if-else et il a été corrigé. – Dhruv

Répondre

3

Utilisez lsof ou un débogueur pour trouver quels sont les fichiers de votre processus a ouvert. Augmenter la limite ne fera que retarder le moment où vous manquerez de descripteurs.

+0

Merci. Je ne fermais pas le fichier/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed. Ceci a été clairement montré en exécutant lsof + p . – Dhruv

Questions connexes