Für die aktuelle Prozessanzahl können Sie getrlimit
verwenden Um das Dateideskriptorlimit zu erhalten, iterieren Sie dann über alle Ganzzahlen von 0 bis zu diesem Limit und versuchen Sie, fcntl
aufzurufen mit dem F_GETFD
Befehl. Es wird nur bei den tatsächlich geöffneten Dateideskriptoren erfolgreich sein, sodass Sie sie zählen können.
Bearbeiten: Ich habe jetzt einen besseren Weg, es zu tun. Nachdem Sie den rlimit
erhalten haben , erstellen Sie ein großes Array von struct pollfd
(wenn möglich so groß wie das Limit; andernfalls können Sie es in mehrere Läufe/Aufrufe aufteilen) mit jedem fd im Bereich und dem events
Mitglied auf 0 gesetzt. Rufen Sie poll
auf auf dem Array mit 0 Timeout und suchen Sie nach POLLNVAL
Flag im revents
für jedes Mitglied. Dies wird Ihnen mit einem einzigen Syscall statt einem Syscall pro fd sagen, welche aus einer potenziell riesigen Menge von fds ungültig sind.
Sie können /proc/sys/fs/file-nr
lesen um die Gesamtzahl der zugewiesenen und freien Dateisystem-Handles sowie die maximal zulässige Anzahl zu ermitteln.
[[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
Um die derzeit verwendete Anzahl zu berechnen, geben Sie einfach allocated - free
ein . Sie können auch einen Prozentsatz der verwendeten Deskriptoren berechnen, indem Sie ((allocated - free) / max) * 100
ausführen
Was den Prozess pro Prozess angeht, bin ich mir nicht sicher, ob Sie dies programmatisch tun können.
Hier ist ein Tutorial, wie man es mit lsof
macht trotzdem:http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html
Da Sie sagen, dass Sie Linux verwenden, können Sie den Ordner /proc/self/fd/
öffnen die symbolische Links zu allen offenen Dateideskriptoren enthalten sollte .