Portabilität von Dateideskriptor-Links

20

Ich habe mich das immer gefragt, habe mir aber nie die Zeit genommen, es herauszufinden. Deshalb werde ich es jetzt tun - wie portabel ist die hier gezeigte Verwendung von entweder /proc/$$/fd/$Noder /dev/fd/$N? Ich verstehe POSIX-Garantien /dev/null, /dev/tty, and /dev/console (obwohl ich das erst neulich nach dem Lesen der Kommentare zu dieser Antwort herausgefunden habe ), aber was ist mit diesen anderen?

Soweit ich das beurteilen kann, sind sie ziemlich verbreitet, aber in welchen Systemen kann ich nicht damit rechnen, sie zu finden? Warum nicht? Ist es wahrscheinlicher, das eine als das andere zu finden? Werden sie immer ähnliche Attribute aufweisen?

Ich benutze diese Geräte in der Regel ziemlich häufig und ich würde gerne wissen, ob es eine Chance gibt, dass ich kurz davor stehe, es einfach zu versuchen.

Auch die obigen Fragen sollten so verstanden werden, dass sie nur das sind, was ich zu wissen glaube , aber da ich sie natürlich an erster Stelle stellen muss, kann es sein, dass ich es in dieser Hinsicht nicht am besten weiß, und sie sollten nicht als strenge Anforderungen für angesehen werden eine Antwort. Geben Sie mir bitte Bescheid, wenn Sie können.

mikeserv
quelle

Antworten:

27

Die Symlinks sind unter Linux quasi universell, existieren aber nirgendwo anders (außer bei Cygwin, das sie emuliert). gibt es auch unter AIX und Solaris, aber keine Symlinks. Portabel, um Informationen zu geöffneten Dateien zu erhalten, installieren Sie ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof

Unices mit /proc/PID/fd

Linux

Unter Linux befindet sich ein leicht magischer symbolischer Link zu der Datei, die der Prozess mit der ID PID im Dateideskriptor NUM geöffnet hat . Dieser Link ist insofern magisch, als er beispielsweise verwendet werden kann, um auf die Datei zuzugreifen, selbst wenn die Datei entfernt wird. Der Link verfolgt die Datei auch durch Umbenennen. ist eine magische symbolische Verknüpfung, die darauf hinweist, wo PID der Prozess ist, der auf die Verknüpfung zugreift./proc/PID/fd/NUM/proc/self/proc/PID

Diese Funktion ist auf nahezu allen Linux-Systemen verfügbar. Es wird vom Treiber für das Proc-Dateisystem bereitgestellt , das technisch optional ist, aber für so viele Dinge (einschließlich der psArbeit, aus der es liest ) verwendet wird, dass es selbst auf eingebetteten Systemen fast nie ausgelassen wird./proc/PID

Cygwin

Cygwin emuliert Linux (für Cygwin-Prozesse) und ./proc/PID/fd/NUM/proc/self

Solaris (seit Version 2.6), AIX

Für jeden Dateideskriptor sind Einträge vorhanden, die jedoch denselben Typ wie die geöffnete Datei haben und daher keine Informationen zum Pfad der Datei enthalten. Sie melden jedoch dieselben Informationen wie an den Prozess, bei dem die Datei geöffnet ist. Sie können also feststellen, auf welchem ​​Dateisystem sich die Datei befindet und welche Inode-Nummer sie hat. Verzeichnisse werden als symbolische Links angezeigt, es handelt sich jedoch um magische Symlinks, denen nur gefolgt werden kann. Sie geben eine leere Zeichenfolge zurück./proc/PID/fdstatfstatreadlink

Unter AIX zeigt der procfilesBefehl einige Informationen zu den geöffneten Dateien eines Prozesses an. Unter Solaris zeigt der pfilesBefehl einige Informationen zu den geöffneten Dateien eines Prozesses an. Dies beinhaltet nicht den Pfad zur Datei (unter Solaris seit Solaris 10, siehe unten).

Solaris (seit Version 10 )

Zusätzlich haben moderne Solaris-Versionen symbolische Links, die den Symlinks in Linux ähneln . Der Befehl zeigt Informationen zu den geöffneten Dateien eines Prozesses an, einschließlich der Pfade./proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles

Plan9

/proc/PID/fdist eine Textdatei, die einen Datensatz (eine Zeile) pro Dateideskriptor enthält, der vom Prozess geöffnet wird. Der Dateiname wird dort nicht nachverfolgt.

QNX

/proc/PID/ ist ein Verzeichnis, das jedoch keine Informationen zu Dateideskriptoren enthält.

Unices /procohne direkten Zugriff auf Dateideskriptoren

(Hinweis: Manchmal ist es möglich, Informationen über die geöffneten Dateien eines Prozesses zu erhalten, indem Sie das Speicherabbild durchsuchen, auf das unter zugegriffen werden kann /proc. Ich zähle das nicht als „direkten Zugriff“.)

Unices wo ist eine Datei/proc/PID

Das proc-Dateisystem selbst startete in der 8. Edition von UNIX, hatte jedoch eine andere Struktur und durchlief Plan 9 und einige Unices. Ich denke, dass alle Betriebssysteme mit einem /procEintrag für jede PID haben, aber auf vielen Systemen ist es eine reguläre Datei, kein Verzeichnis. Folgende Systeme haben ein , mit dem gelesen werden muss :/proc/PIDioctl

MINIX 3

MINIX 3 verfügt über einen procfs-Server, der verschiedene Linux-ähnliche Komponenten einschließlich Verzeichnissen bereitstellt . Das gibt es aber nicht ./proc/PID//proc/PID/fd

FreeBSD

FreeBSD verfügt über Verzeichnisse, die jedoch keine Informationen zu offenen Dateideskriptoren enthalten. (Es gibt jedoch Linux-ähnliche Programme , die über einen symbolischen Link Zugriff auf die ausführbare Datei gewähren.)/proc/PID//proc/PID/file/proc/PID/exe

FreeBSDs procfs ist veraltet .

Unices ohne /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

Dateideskriptorinformationen über andere Kanäle

Fixiereinheit

Der fuserBefehl listet die Prozesse auf, für die eine angegebene Datei oder eine Datei auf dem angegebenen Einhängepunkt geöffnet ist. Dieser Befehl ist Standard (verfügbar auf allen XSI- kompatiblen Systemen, dh POSIX mit der X / Open-Systemschnittstellenerweiterung).

Mit diesem Dienstprogramm können Sie nicht von einem Prozess zu Dateinamen wechseln.

Lsof

Lsof steht für "list open files". Es ist ein Drittanbieter-Tool , das für die meisten Unix-Varianten verfügbar ist (aber normalerweise nicht Teil der Standardinstallation ist). Das Abrufen von Informationen zu geöffneten Dateien ist sehr systemabhängig, da Sie aufgrund der obigen Analyse möglicherweise den Verdacht hatten. Der lsof-Betreuer hat die Arbeit gemacht, alles unter einer einzigen Schnittstelle zu kombinieren.

Sie können die FAQ lesen, um zu sehen, mit welchen Schwierigkeiten sich lsof abfinden muss. Bei den meisten Unices ist zum Abrufen von Informationen über die Namen der geöffneten Dateien das Analysieren von Kerneldatenstrukturen erforderlich. Zitat aus FAQ 3.3 „Warum werden keine vollständigen Pfadnamen gemeldet?“:

Lsof kann keine Pfadnamenskomponenten aus den Kernel-Namenscaches der folgenden Dialekte abrufen:

  • AIX

Nur der Linux-Kernel zeichnet vollständige Pfadnamen in den Strukturen auf, die er für geöffnete Dateien verwaltet. Stattdessen konvertieren die meisten Kernel Pfadnamen in Geräte- und Knotennummern-Doublets und verwenden sie nach dem Öffnen von Dateien für nachfolgende Dateiverweise.

Wenn Sie Informationen aus lsofder Ausgabe analysieren müssen, verwenden Sie unbedingt den -FModus (ein Feld pro Zeile), vorzugsweise den -F0Modus (durch Nullen getrennte Felder). Um Informationen über einen bestimmten Dateideskriptor eines bestimmten Prozesses zu erhalten, verwenden Sie die -aOption mit und , z .-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM für Dateideskriptoren des aktuellen Prozesses

Viele Unix-Varianten bieten einem Prozess die Möglichkeit, über einen Dateinamen auf seine geöffneten Dateien zuzugreifen: Das Öffnen entspricht dem Aufrufen . Diese Namen sind nützlich, wenn ein Programm einen Dateinamen benötigt, Sie jedoch eine bereits geöffnete Datei (z. B. eine Pipe oder einen Socket) übergeben möchten. Beispielsweise verwenden die Shells, die die Prozessersetzung implementieren , diese, sofern verfügbar (mithilfe einer temporären Named Pipe, wenn diese nicht verfügbar ist)./dev/fd/NUMdup(NUM)/dev/fd

Wo /dev/fdvorhanden, gibt es auch normalerweise (immer?) Synonyme (manchmal symbolische Links, manchmal harte Links, manchmal magische Dateien mit entsprechenden Eigenschaften) /dev/stdin= /dev/fd/0, /dev/stdout= /dev/fd/1, /dev/stderr= /dev/fd/2.

  • Unter Linux gibt /dev/fdes einen symbolischen Link zu /proc/self/fd.
  • Unter den meisten Unices ( IRIX , OpenBSD , NetBSD , SCO, Solaris ,…) sind die Einträge in /dev/fdZeichengeräte. In der Regel wird angezeigt, ob der Dateideskriptor geöffnet ist oder nicht, und Einträge für Dateideskriptoren über einer bestimmten Anzahl sind möglicherweise nicht verfügbar.
  • Unter FreeBSD und OSX stellt das Dateisystem fdescfs ein dynamisches /dev/fdVerzeichnis zur Verfügung, das den offenen Deskriptoren des aufrufenden Prozesses folgt. Eine statische /dev/fdist vorhanden /dev/fdist nicht montiert.
  • Wird unter OSF / 1 (Tru64) /dev/fdüber fdfs bereitgestellt .
  • Unter /dev/fdAIX oder HP-UX gibt es keine .
Gilles 'SO - hör auf böse zu sein'
quelle
Ihre Aussagen zu Solaris sind etwas veraltet. Bei Solaris-Releases, die jünger als 10 Jahre sind, pfileszeigt der Befehl den Dateideskriptorpfad an. Diese Informationen werden aus dem /proc/<pid>/pathVerzeichnis abgerufen, das Sie möglicherweise auch erwähnen. Siehe docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre
9

Die Art /procund Weise der Implementierung und die darin enthaltenen Funktionen sind in keiner Weise standardisiert, siehe hier . Laut Wikipedia läuft FreeBSD aus /proc, siehe hier für Details .

Ab /dev, /dev/fd/ist es nicht Teil von POSIX oder der Single User Specification (SUSv3) , während System V und BSD unterstützen.

Nachtrag:

Linux: /dev/fd/*sind symlinks zu /proc/self/fd.

FreeBSD: /dev/fd/*wird über fdescfs bereitgestellt.

NetBSD: wie FreeBSD.

OpenBSD: wie FreeBSD.

Solaris: hat /dev/fd/*.

IRIX: hat /dev/fd/*.

Tru64 Unix: /dev/fd/*Laut nixdoc.net ist die Original- Tru64-Dokumentation bei HP unergründlich (Junge, was für ein Durcheinander! Du findest nichts!).

AIX: Keine Angabe aus öffentlich zugänglichen Unterlagen.

HP-UX: wie AIX.

Gegenmodus
quelle
Also finde ich /dev/fd/1auf einer BSD eine, die auf meine aktuelle verlinkt 1>? Eine Sache, die ich normalerweise unter Linux mache, ist echo 'command' | . /dev/fd/0- ist es wahrscheinlich, dass so etwas auf der ganzen Linie funktioniert, denken Sie?
mikeserv
Ich habe momentan keinen Zugang zu einem BSD-System, aber so verstehe ich es, ja.
Gegenmodus
1
Wenn Sie jemals die Zeit finden, nur ein bisschen mehr darauf einzugehen, werde ich diese Antwort akzeptieren, denke ich, abgesehen von irgendwelchen überraschenden Profis und Beiträgen. In jedem Fall war der erste Artikel, auf den verwiesen wurde, eine aufschlussreiche Lektüre - vielen Dank.
mikeserv
Ja. Prof fd ist wohl doch aufgetaucht, oder? Also viel Glück beim nächsten Mal?
mikeserv
1
Also gut. Linux: / dev / fd / * sind symbolische Links zu / proc / self / fd. FreeBSD: / dev / fd / * wird über fdescfs bereitgestellt. NetBSD: wie FreeBSD. OpenBSD: wie FreeBSD. Solaris: hat / dev / fd / *. IRIX: hat / dev / fd / *. Tru64 Unix: hat / dev / fd / * (laut nixdoc.net ist die Original- Tru64-Dokumentation bei HP nicht zu ergründen ). AIX: Keine Angabe aus öffentlich zugänglichen Unterlagen. HP-UX: wie AIX.
Gegenmodus