Pro aktuální počet procesů můžete použít getrlimit
abyste získali limit deskriptoru souboru, pak iterujte přes všechna celá čísla od 0 do tohoto limitu a zkuste zavolat fcntl
s F_GETFD
příkaz. Uspěje pouze na deskriptorech souborů, které jsou skutečně otevřené, takže je můžete spočítat.
Upravit: Teď mám lepší způsob, jak to udělat. Po získání rlimit
, vytvořte velké pole struct pollfd
(pokud možno co největší jako limit; jinak jej můžete rozdělit na několik běhů/volání) s každým fd v rozsahu a events
člen nastaven na 0. Volejte poll
na poli s časovým limitem 0 a vyhledejte POLLNVAL
příznak v revents
pro každého člena. To vám řekne, které z potenciálně velké sady fd jsou neplatné s jediným syscall, spíše než jedním syscall na fd.
Můžete si přečíst /proc/sys/fs/file-nr
zjistit celkový počet alokovaných a volných ovladačů souborového systému a také maximální povolené množství.
[[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
Chcete-li vypočítat číslo, které se aktuálně používá, stačí provést allocated - free
. Můžete také vypočítat procento použitých deskriptorů pomocí ((allocated - free) / max) * 100
Pokud jde o jednotlivé procesy, nejsem si jistý žádným programovým způsobem, jak to můžete udělat.
Zde je návod, jak to udělat s lsof
každopádně:http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html
Protože říkáte, že používáte Linux, můžete otevřít složku /proc/self/fd/
který by měl obsahovat symbolické odkazy na všechny otevřené deskriptory souborů .