Pipe Handle-Vererbung
Der Pipeserver steuert, ob die Ziehpunkte auf folgende Weise geerbt werden können:
- Die CreatePipe-Funktion empfängt eine SECURITY_ATTRIBUTES Struktur. Wenn der Pipeserver die bInheritHandle Member dieser Struktur auf TRUEfestlegt, können die von CreatePipe erstellten Handles geerbt werden.
- Der Pipeserver kann die DuplicateHandle--Funktion verwenden, um die Vererbung eines Pipehandles zu ändern. Der Pipeserver kann ein nicht vererbbares Duplikat eines vererbbaren Pipehandles oder ein vererbbares Duplikat eines nicht vererbbaren Pipehandles erstellen.
- Mit der CreateProcess-Funktion kann der Pipeserver angeben, ob ein untergeordneter Prozess alle oder keines der vererbbaren Handles erbt.
Wenn ein untergeordneter Prozess einen Rohrziehpunkt erbt, ermöglicht das System dem Prozess den Zugriff auf die Pipe. Der übergeordnete Prozess muss jedoch den Handlewert mit dem untergeordneten Prozess kommunizieren. Der übergeordnete Prozess führt dies in der Regel durch Umleiten des Standardausgabehandles an den untergeordneten Prozess aus, wie in den folgenden Schritten gezeigt:
- Rufen Sie die GetStdHandle--Funktion auf, um den aktuellen Standardausgabehandle abzurufen; speichern Sie dieses Handle, damit Sie den ursprünglichen Standardausgabehandle wiederherstellen können, nachdem der untergeordnete Prozess erstellt wurde.
- Rufen Sie die SetStdHandle--Funktion auf, um den Standardausgabepunkt auf den Schreibpunkt für die Pipe festzulegen. Jetzt kann der übergeordnete Prozess den untergeordneten Prozess erstellen.
- Rufen Sie die CloseHandle--Funktion auf, um das Schreibkästchen an die Pipe zu schließen. Nachdem der untergeordnete Prozess den Schreibhandle erbt, benötigt der übergeordnete Prozess seine Kopie nicht mehr.
- Rufen Sie SetStdHandle- auf, um den ursprünglichen Standardausgabepunkt wiederherzustellen.
Der untergeordnete Prozess verwendet die GetStdHandle--Funktion, um den Standardausgabepunkt abzurufen, der jetzt ein Handle zum Schreibende einer Pipe ist. Der untergeordnete Prozess verwendet dann die WriteFile--Funktion, um die Ausgabe an die Pipe zu senden. Wenn das untergeordnete Element mit der Pipe fertig ist, sollte er den Rohrziehpunkt schließen, indem CloseHandle- oder durch Beenden aufgerufen wird, wodurch der Ziehpunkt automatisch geschlossen wird.
Der übergeordnete Prozess verwendet die ReadFile--Funktion, um Eingaben von der Pipe zu empfangen. Daten werden als Bytestrom in eine anonyme Pipe geschrieben. Dies bedeutet, dass der übergeordnete Prozess, der aus einer Pipe gelesen wird, nicht zwischen den in separaten Schreibvorgängen geschriebenen Bytes unterscheiden kann, es sei denn, die übergeordneten und untergeordneten Prozesse verwenden ein Protokoll, um anzugeben, wo der Schreibvorgang endet. Wenn alle Schreibziehpunkte für die Pipe geschlossen sind, gibt die ReadFile--Funktion Null zurück. Es ist wichtig, dass der übergeordnete Prozess sein Handle am Schreibende der Pipe schließt, bevor ReadFile-aufgerufen wird. Wenn dies nicht geschehen ist, kann der ReadFile--Vorgang keine Null zurückgeben, da der übergeordnete Prozess über ein geöffnetes Handle zum Schreibende der Pipe verfügt.
Das Verfahren zum Umleiten des Standardeingabehandles ähnelt dem zum Umleiten des Standardausgabehandles, mit der Ausnahme, dass das Lesehandle der Pipe als Standardeingabehandle des untergeordneten Elements verwendet wird. In diesem Fall muss der übergeordnete Prozess sicherstellen, dass der untergeordnete Prozess nicht das Schreibkästchen der Pipe erbt. Wenn dies nicht geschehen ist, kann der vom untergeordneten Prozess ausgeführte ReadFile-Vorgang keine Null zurückgeben, da der untergeordnete Prozess über ein offenes Handle für das Schreibende der Pipe verfügt.
Ein Beispielprogramm, das anonyme Pipes verwendet, um die Standardhandles eines untergeordneten Prozesses umzuleiten, finden Sie unter Erstellen eines untergeordneten Prozesses mit umgeleiteter Eingabe- und Ausgabe-.