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
Vous êtes définitivement fuyant quelque part. – Joe
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