Pour le nombre de processus en cours, vous pouvez utiliser getrlimit
pour obtenir la limite du descripteur de fichier, puis parcourez tous les entiers de 0 à cette limite et essayez d'appeler fcntl
avec le F_GETFD
commande. Il ne réussira que sur les descripteurs de fichiers réellement ouverts, vous permettant de les compter.
Modifier : J'ai maintenant une meilleure façon de le faire. Après avoir obtenu le rlimit
, faites un grand tableau de struct pollfd
(aussi grand que la limite si possible ; sinon, vous pouvez le décomposer en plusieurs exécutions/appels) avec chaque fd dans la plage et le events
membre défini sur 0. Appelez poll
sur le tableau avec 0 timeout, et recherchez le POLLNVAL
drapeau dans le revents
pour chaque membre. Cela vous indiquera lesquels parmi un ensemble potentiellement énorme de fds sont invalides avec un seul appel système, plutôt qu'un seul appel système par fd.
Vous pouvez lire /proc/sys/fs/file-nr
pour trouver le nombre total de descripteurs de système de fichiers alloués et libres ainsi que le maximum autorisé.
[[email protected] proc]# cat /proc/sys/fs/file-nr
3853 908 53182
| | |
| | |
| | max: maximum open file descriptors
| free: total free allocated file descriptors
allocated: total allocated file descriptors since boot
Pour calculer le nombre actuellement utilisé, faites simplement allocated - free
. Vous pouvez également calculer un pourcentage de descripteurs utilisés en faisant ((allocated - free) / max) * 100
En ce qui concerne le processus par processus, je ne suis pas sûr d'une manière programmatique de le faire.
Voici un tutoriel sur la façon de le faire avec lsof
de toute façon :http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html
Puisque vous dites que vous êtes sous Linux, vous pouvez ouvrir le dossier /proc/self/fd/
qui doit contenir des liens symboliques vers tous les descripteurs de fichiers ouverts .