Den höchsten zugewiesenen Dateideskriptor erhalten
Gibt es eine portable Art und Weise (POSIX), um den höchsten zugewiesenen Datei-Deskriptor-Nummer für den aktuellen Prozess?
Ich weiß, dass es ein netter Weg, um die Anzahl auf AIX, zum Beispiel, aber ich bin auf der Suche nach einem tragbaren Methode.
Den Grund ich Frage ist, dass ich möchte, um zu schließen Sie alle geöffneten Datei-Deskriptoren. Mein Programm ist ein server, der als root läuft und die Gabeln und die execs Kind-Programme für nicht-root-Benutzer. Verlassen der privilegierten Dateideskriptoren geöffnet in der Kind-Prozess ist ein Sicherheits-problem. Einige Dateideskriptoren geöffnet werden kann durch den code, den ich nicht kontrollieren kann (die C-Bibliothek, Bibliotheken von Drittanbietern, etc.), so kann ich nicht verlassen sich auf FD_CLOEXEC
.
InformationsquelleAutor der Frage Ville Laurikari | 2009-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während portable, schließen Sie alle Datei-Deskriptoren, bis zu
sysconf(_SC_OPEN_MAX)
ist nicht zuverlässig, weil auf den meisten Systemen dieser Aufruf liefert die aktuelle Datei-Deskriptor weiche Grenze, die hätten abgesenkt unterhalb der höchsten verwendeten Datei-Deskriptors. Ein weiteres Problem ist, dass auf vielen Systemensysconf(_SC_OPEN_MAX)
zurückgeben kannINT_MAX
die dazu führen können, dass dieser Ansatz sehr langsam. Leider gibt es keine zuverlässige, portable alternative, die nicht die Iteration über alle möglichen nicht-negativen int Datei-Deskriptor.Obwohl nicht tragbar, meisten Betriebssystemen gemeinsam nutzen, stellen heute eine oder mehrere der folgenden Lösungen für dieses problem:
Einer library-Funktion, um schließen Sie alle Datei-Deskriptoren >= fd. Dies ist die einfachste Lösung für den Allgemeinen Fall zu schließen, alle Datei-Deskriptoren, obwohl es nicht verwendet werden kann für viel mehr. Schließen Sie alle Datei-Deskriptoren, außer für eine bestimmte Gruppe,
dup2
verwendet werden können, um Sie zu bewegen, um die low-end-vorher, und verschieben Sie Sie zurück später, wenn nötig.closefrom(fd)
(Solaris 9 oder höher, FreeBSD 7.3 oder 8.0 und höher, NetBSD-3.0 oder höher, OpenBSD 3.5 oder höher).fcntl(fd, F_CLOSEM, 0)
(AIX, IRIX, NetBSD)Einer library-Funktion zu bieten, die maximale Datei-Deskriptor derzeit in Verwendung durch den Prozess. Schließen Sie alle Datei-Deskriptoren, die über eine bestimmte Anzahl, entweder schließen Sie alle von Ihnen bis zu diesem maximum, oder kontinuierlich, und schließen Sie die höchste file-descriptor in einer Schleife, bis die niedrige Grenze erreicht. Was effizienter ist, hängt von der Datei-Deskriptor-Dichte.
fcntl(0, F_MAXFD)
(NetBSD)pstat_getproc(&ps, sizeof(struct pst_status), (size_t)0, (int)getpid())
Gibt Informationen über den Prozess, einschließlich der höchsten file-Deskriptor die aktuell in
ps.pst_highestfd
. (HP-UX)Einen Verzeichnis enthält einen Eintrag für jedes offene file-Deskriptor. Dies ist der flexibelste Ansatz, da Sie ermöglicht für schließen Sie alle Datei-Deskriptoren, finden die höchste Datei-Deskriptor, oder tun irgendetwas anderes, auf jedem open-file-Deskriptor, sogar jene, die von einem anderen Prozess (auf den meisten Systemen). Dies kann jedoch komplizierter sein als die anderen Ansätze für die gemeinsame Nutzung. Auch, es kann fehlschlagen, für eine Vielzahl von Gründen, wie die/proc /fdescfs nicht montiert ist, eine chroot-Umgebung, oder keine Datei-Deskriptoren verfügbar sind, öffnen Sie das Verzeichnis (Prozess-oder system-Grenze). Daher ist die Nutzung dieser Ansatz wird oft in Kombination mit einem fallback-Mechanismus. Beispiel (OpenSSH)ein weiteres Beispiel (glib).
/proc/
pid/fd/
oder/proc/self/fd/
(Linux, Solaris, AIX, Cygwin, NetBSD)(AIX nicht unterstützt "
self
")/dev/fd/
(FreeBSD, Darwin, OS X)Kann es schwierig sein, um alle Ecke Fälle zuverlässig mit diesem Ansatz. Zum Beispiel betrachten die situation, wo alle Datei-Deskriptoren >= fd geschlossen werden, aber alle file-Deskriptoren < fd verwendet werden, den aktuellen Prozess-Ressourcen-limit ist fdund es gibt Datei-Deskriptoren, >= fd im Einsatz. Da der Prozess das limit der Ressourcen erreicht wurde das Verzeichnis nicht geöffnet werden kann. Wenn das schließen jedes file-Deskriptor von fd durch die Ressourcen einschränken oder
sysconf(_SC_OPEN_MAX)
ist als fallback verwendet, wird nichts geschlossen werden.InformationsquelleAutor der Antwort mark4o
POSIX Weg ist:
(beachten Sie, dass die Schließung von 3 bis zu behalten, stdin/stdout/stderr öffnen)
close() harmlos gibt EBADF wenn der file-Deskriptor ist nicht geöffnet. Es gibt keine Notwendigkeit, die Abfälle einem anderen system Aufruf überprüfen.
Einige UNIX-Varianten unterstützen eine closefrom(). Dies vermeidet die übermäßige Anzahl der Aufrufe von close() in Abhängigkeit von der maximal möglichen Datei-Deskriptor-Nummer. Während die beste Lösung, die ich bin mir dessen bewusst, es ist völlig nonportable.
InformationsquelleAutor der Antwort chuck
Ich habe code geschrieben, um alle Plattform-spezifischen features. Alle Funktionen sind async-signal-safe. Dachte, die Leute könnten das nützlich finden. Nur getestet auf OS X jetzt, fühlen Sie sich frei, um zu verbessern/beheben.
InformationsquelleAutor der Antwort
Recht, wenn das Programm gestartet ist und noch nicht geöffnet, nichts. E. g. wie der start von main(). Rohr und Gabel ab sofort ein executer-server. Auf diese Weise ist es den Speicher und andere details ist sauber und man kann es eben auch geben, die Dinge zu Gabel & exec.
Wenn du möchtest, dass IO auf das ausgeführte Programm der Testamentsvollstrecker server zu tun haben-Buchse leitet, und Sie können die Verwendung von unix-sockets.
InformationsquelleAutor der Antwort over_optimistic
Warum nicht schließen Sie alle Deskriptoren, die von 0 bis, sagen wir, 10000.
Wäre es ziemlich schnell, und das Schlimmste, was passieren würde, ist EBADF.
InformationsquelleAutor der Antwort alamar