Per il conteggio del processo corrente, puoi utilizzare getrlimit
per ottenere il limite del descrittore di file, quindi iterare su tutti i numeri interi da 0 a quel limite e provare a chiamare fcntl
con il F_GETFD
comando. Avrà successo solo sui descrittori di file che sono effettivamente aperti, permettendoti di contarli.
Modifica: Ora ho un modo migliore per farlo. Dopo aver ottenuto il rlimit
, creare un ampio array di struct pollfd
(grande quanto il limite se possibile; altrimenti puoi suddividerlo in più esecuzioni/chiamate) con ogni fd nell'intervallo e events
membro impostato su 0. Chiama poll
sull'array con timeout 0 e cerca il POLLNVAL
flag nel revents
per ogni membro. Questo ti dirà quali tra un insieme potenzialmente enorme di fd non sono validi con una singola chiamata di sistema, piuttosto che una chiamata di sistema per fd.
Puoi leggere /proc/sys/fs/file-nr
per trovare il numero totale di handle di file system allocati e liberi, nonché il massimo consentito.
[[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
Per calcolare il numero attualmente in uso, basta digitare allocated - free
. Puoi anche calcolare una percentuale di descrittori usati facendo ((allocated - free) / max) * 100
Per quanto riguarda i processi, non sono sicuro di un modo programmatico per farlo.
Ecco un tutorial su come farlo con lsof
comunque:http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html
Dato che dici di essere su Linux, puoi aprire la cartella /proc/self/fd/
che dovrebbe contenere collegamenti simbolici a tutti i descrittori di file aperti .