Standardmäßig bleiben Dateideskriptoren für alle Exec-Funktionen geöffnet. Der Nutzen ist vielleicht für die Deskriptoren 0-2 verständlich. Aber gibt es einen praktischen Anwendungsfall, um andere Deskriptoren offen zu halten? Gibt es echte Anwendungen, die auf dieser Tatsache beruhen?
7
closefrom(2)
Anruf).Antworten:
Es gibt ein Flag, das Sie für einen Dateideskriptor setzen können (bei
open()
: O_CLOEXEC oder höher mitfcntl()
: FD_CLOEXEC), wenn Sie nicht möchten, dass fd an ausgeführte Befehle übergeben wird.Dies sollten Sie für Ihre internen Dateideskriptoren tun, wenn Sie Befehle ausführen möchten.
In Muscheln ist es das, was
ksh93
Sieexec 3< some-file
zum Beispiel tun . Für andere Shells oder FDS, mit denen geöffnet wurde{ cmd1; cmd2; } 3< file
, müssen Sie von Hand schließen, wenn Sie nicht möchtencmd1
odercmd2
auf dieses Fd zugreifen möchten :{cmd1 3<&-; cmd2; } 3< file
. Das ist eine gute Übung, wird aber nicht immer befolgt, da es normalerweise nicht kritisch ist, wenn Sie es nicht tun .Nun, ob die Funktion nützlich ist. Ja, mehrere Befehle hängen davon ab.
Einige Befehle verwenden einen Dateideskriptor als Argument, das von einem Aufrufer geöffnet werden soll. Einige Beispiele, die mir in den Sinn kommen:
xterm
mit seiner-S
Optionqemu
für verschiedene Dingeflock
(um eine Datei auf dem fd des Anrufers zu sperren)test
Befehl aka[
für seine-t
Option (OK, dastest
Dienstprogramm ist heutzutage in den meisten Bourne-ähnlichen Shells enthalten, aber es gibt immer noch einentest
Befehl, der ausgeführt werden kann).dialog
benötigt Dateideskriptoren für die Eingabe vom Benutzer, die Ausgabe und den Fehler für den Benutzer sowie die Eingabe und Ausgabe für den Aufrufer, sodass Sie dafür zusätzliche fds verwenden können.gpg
oderopenssl
an die Sie einen Dateideskriptor angeben können, um die Passphrase oder andere Informationen zu kommunizieren.Es gibt eine Reihe von Helfer - Dienstprogramme (zum Beispiel die Notwendigkeit, ausführen könnte einen Teil eines Befehls als ein anderer Benutzer oder eine Gruppe mit einem setuid / setgid ausführbare Datei ausgeführt werden ) , die sich darauf verlassen.
Prozesssubstitution beruht darauf:
In ,,
diff <(cmd1) <(cmd2)
werden 2 Dateideskriptoren (an Pipes) übergebendiff
und diff greift auf sie zu, indem sie über das als Argument übergebene spezielle / dev / fd / n geöffnet werden.Bei Shells ohne Prozessersetzung tun Sie dasselbe von Hand mit folgenden Dingen:
quelle
TinyMUSH und wahrscheinlich viele seiner Geschwister- und Kindercodebasen nutzen diese Funktionalität von exec mit großer Wirkung. Man kann einen Befehl ausgeben, um den Server neu zu starten und möglicherweise auf eine völlig neue Binärdatei zu aktualisieren, während die Benutzer verbunden bleiben.
Dazu schreiben Sie eine kleine Datenbank mit Informationen zu jedem verbundenen Benutzer, einschließlich seines Dateideskriptors. Die neu ausgeführte Kopie von TinyMUSH liest die Neustart-Datenbank, um das Wissen der verbundenen Benutzer wiederherzustellen und dort fortzufahren, wo sie aufgehört hat.
Endergebnis: Neue Funktionen werden mit nur einer kurzen Pause veröffentlicht, die für Benutzer sichtbar ist.
Nginx macht etwas Ähnliches, um binäre Upgrades durchzuführen, ohne Verbindungen zu verlieren.
quelle
Verbundene Sockets können auf diese Weise an einen untergeordneten Prozess übergeben werden. So kann beispielsweise ein Netzwerkserver, der eingehende Verbindungen akzeptiert, die Verarbeitung vollständig an einen anderen Prozess übergeben.
Ein allgegenwärtiges Beispiel finden Sie im Quellcode für inetd .
quelle
inetd
Filedeskriptoren verwendet0
,1
und2
für die Zwecke der offenen Buchse vorbei ist eine Konvention , dass Linien mit denen offen aus anderen Gründen zu halten.main
undrun_service
. Es ist kein Beispiel für die Übergabe eines anderen fds als 0,1,2, was die Frage war.Ich glaube nicht, dass es echte, generische Programme gibt, die etwas über Deskriptor 2 hinaus übergeben. Wenn dies der Fall ist, müsste das ausgeführte Programm fest codierte Dateideskriptornummern annehmen, z
oder
Das ist eine schlechte Codierungspraxis. Nur in Fällen, in denen Sie sowohl das Eltern- als auch das Kinderprogramm streng kontrollieren und niemand anderes eingreifen kann, kann dies sinnvoll sein.
quelle