Wie finde ich die Datei-handles, die mein Verfahren eröffnet hat, die in Linux?
Wenn wir eine Gabel in Unix, offene Datei-handles vererbt werden, und wenn wir Sie nicht brauchen, um Sie zu benutzen sollten wir schließen. Allerdings, wenn wir uns mit Bibliotheken, Datei-handles geöffnet werden kann, für die haben wir keinen Zugriff auf das handle. Wie überprüfen wir für diese offenen file-handles?
InformationsquelleAutor sep | 2008-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Bibliotheken sind Dateien öffnen, die Sie nicht kennen, Woher wissen Sie, Sie brauchen Sie nicht nach einer Gabel? Unexported Griffe sind eine interne Bibliothek detail, wenn die Bibliothek will, dass Sie geschlossen wird es registrieren eine atfork () - handler, um Sie zu schließen. Zu Fuß, um hinter einige Stück code, das schließen der Datei Griffen hinter seinen Rücken führt zu subtilen, schwer zu Debuggen Probleme, da die Bibliothek Fehlers unerwartet beendet, wenn er versucht, zu arbeiten, mit Griff, weiß es auch richtig öffnen, aber nicht schließen.
InformationsquelleAutor Louis Gerbarg
In Linux können Sie überprüfen
/proc/<pid>/fd
Verzeichnis - für jede offene fd es wird eine Datei mit dem Namen als Griff. Ich bin mir fast sicher, dieser Weg ist nicht tragbar.Alternativ können Sie
lsof
- verfügbar für Linux -, AIX -, FreeBSD-und NetBSD, nachman lsof
.InformationsquelleAutor qrdl
Können Sie aus einer shell:
lsof -P -n -p _PID_
Wo PID ist Ihr Prozess-pid.
diese Antwort ist vielleicht nicht das beste, wenn man sich die Beschreibung Ihres Problems, aber es ist sicher, dass die Nägel die eigentliche Frage. So, danke Felipe für die Hilfe finden, die Griffe von meinen Vorgang 🙂
InformationsquelleAutor
Wie bereits erwähnt, @Louis Gerbarg Antwort, die Bibliotheken werden wahrscheinlich erwarten, dass die Datei verarbeitet werden offen gehalten, auf
fork()
(was soll das sein, nachdem alle, eine nahezu identische Kopie des Eltern-Prozesses).Das problem die meisten Menschen haben, ist auf der
exec()
die oft folgtfork()
. Hier die richtige Lösung ist, für die Bibliothek erstellt, die Griffe markieren Sie Sie als close-on-exec (FD_CLOEXEC
).Bibliotheken verwendet, die von multithread-Programme haben, gibt es eine race-condition zwischen einer Bibliothek erstellen ein Datei-handle und Einstellung
FD_CLOEXEC
(ein anderer thread kannfork()
zwischen den beiden Operationen). Um dieses problem zu beheben,O_CLOEXEC
wurde in den Linux-kernel.InformationsquelleAutor CesarB
Beginnen mit, Sie nicht wirklich brauchen, zu kümmern, eine ganze Menge über die offenen Datei-Deskriptoren, die Sie nicht kennen. Wenn du weißt, du bist nicht zu schreiben, um Sie wieder zu schließen ist eine gute Idee und tut nicht weh - Sie hat gerade eine Gabel (), nachdem alle, die fds sind offen zweimal. Aber ebenso ist es, wenn Sie lassen Sie Sie offen , Sie werden sich nicht die Mühe, die Sie entweder - nach alle, Sie weiß nicht, über Sie, die Sie vermutlich nicht nach dem Zufallsprinzip zu schreiben.
Als für das, was Ihre Drittanbieter-Bibliotheken tun, es ist ein bisschen wie ein Wurf-up oder so. Einige wohl nicht erwarten, dass in einer situation mit einer Gabel(), und könnten am Ende versehentlich zu schreiben, um die gleichen fd aus zwei Prozesse ohne Synchronisation. Anderen wohl auch nicht erwarten, dass Sie schließen Ihre fds auf Sie. Sie werden zu prüfen haben. Dies ist der Grund, warum es eine schlechte Idee, nach dem Zufallsprinzip öffnen Sie einen Datei-Deskriptor in einer Bibliothek und nicht geben es an den Aufrufer zu verwalten.
Alles, was gesagt, im Sinne der Beantwortung der ursprünglichen Frage, gibt es nicht eine besonders gute Möglichkeit. Sie können rufen Sie
dup()
oderdup2()
auf einem Datei-Deskriptor; wenn es geschlossen ist, der Aufruf schlägt fehl mitEBADF
. Man kann also sagen:aber an diesem Punkt bist du genau so gut sagen
close(oldfd)
in den ersten Platz und ignoriert alle EBADFs.Vorausgesetzt, Sie wollen immer noch nehmen Sie die nukleare option zu schließen, alles, was Sie dann finden müssen, die maximale Anzahl offener Datei-Deskriptoren möglich. Davon 1 bis 65.535 ist keine gute Idee. Zunächst fds bei 0 beginnen, natürlich, aber auch da gibt es keine bestimmten Obergrenze definiert. Tragbar sein, POSIX -
sysconf(_SC_OPEN_MAX)
sollte Ihnen sagen, auf alle gesunden POSIX-system, obwohl es streng genommen optional. Wenn Sie das Gefühl paranoid zu werden, überprüfen Sie den Rückgabewert -1, wenn an diesem Punkt Sie müssen meist fallen zurück auf einen hartcodierten Wert sowieso (1024 sollte in Ordnung sein, es sei denn, du tust etwas sehr seltsam). Oder, wenn du bist gut mit Linux-spezifisch, Sie können Graben, um in /proc.Vergessen Sie nicht, nicht in der Nähe Dateideskriptoren 0, 1 und 2 - das kann wirklich verwirren alles.
InformationsquelleAutor C Pirate
Ich Stimme mit dem, was andere Leute gesagt haben, über die Schließung random-Dateien als gefährlich. Sie könnten am Ende die Einreichung einige ziemlich interessante bug-reports für alle Ihre third-party-tools.
Sagte, dass, wenn Sie wissen Sie nicht brauchen, diese Dateien zu öffnen, können Sie immer zu Fuß durch alle gültige Datei-Deskriptoren (1 bis 65535, IIRC) und in der Nähe alles, was Sie nicht erkennen.
InformationsquelleAutor Tom Barta
Angemessenen Bibliotheken haben immer die Funktionen, welche unabhängig von Ressourcen (zB. Datei-handles), die Sie zugeordnet haben.
InformationsquelleAutor Hugh Allen
Nur ein link, aber es scheint hilfreich: Wie viele Dateien geöffnet? an netadmintools.com. Es scheint zu verwenden /proc Untersuchungen zu erfahren, einen Prozess " Dateien öffnen, nicht sicher, ob das die einzige Weise ist, oder wenn es eine API. Parsen von Dateien, die für diese Art von Informationen kann ein bisschen ... chaotisch. Auch /proc möglicherweise veraltet zu, etwas zu prüfen.
InformationsquelleAutor unwind
Ist das nicht ein Problem des Designs ? Ist es möglich für den Prozess zu Gabel vor der Initialisierung der Bibliotheken, die diese Dateien öffnen ?
InformationsquelleAutor philant