GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Abrufen der Anzahl der aktuell verwendeten Dateideskriptoren aus dem C-Code

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 .


Linux
  1. Unfähig, den richtigen Exit-Code aus einem Skript zu erhalten?

  2. Dreifach Backtick abgeschirmten Codeblock „` Auszüge aus der Markdown-Datei extrahieren?

  3. Zeilen in einer Datei zählen?

  4. Lesen von Grep-Mustern aus einer Datei?

  5. Wie kann verhindert werden, dass Protokolle zu groß werden?

5 Möglichkeiten, die Anzahl der Zeilen in einer Datei zu zählen

Wie kopiert man eine Datei aus einem anderen Verzeichnis in das aktuelle?

So erhalten Sie den relativen Pfad des aktuellen Verzeichnisses in Tomcat aus der Linux-Umgebung mit Java

Wie bekomme ich den Pfad zur aktuellen Datei (pwd) in Linux von C?

Erstellen Sie eine PEM aus einer PPK-Datei

Wie unterscheidet sich install -c von cp