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.
[example@unixlinux.online 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 .