Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Pipeserver gibt den Pipetypmodus, den Lesemodus und den Wartemodus im dwPipeMode Parameter der funktion CreateNamedPipe an. Pipeclients können diese Pipemodi für ihre Rohrziehpunkte mithilfe der CreateFile--Funktion angeben.
Typmodus
Der Typmodus einer Pipe bestimmt, wie Daten in eine benannte Pipe geschrieben werden. Daten können über eine benannte Pipe entweder als Datenstrom von Bytes oder als Datenstrom von Nachrichten übertragen werden. Der Pipeserver gibt den Pipetyp beim Aufrufen CreateNamedPipe- an, um eine Instanz einer benannten Pipe zu erstellen. Die Typenmodi müssen für alle Instanzen einer Pipe identisch sein.
Zum Erstellen einer Byteart-Pipe geben Sie PIPE_TYPE_BYTE an, oder verwenden Sie den Standardwert. Die Daten werden als Bytestrom in die Pipe geschrieben, und das System unterscheidet nicht zwischen den in verschiedenen Schreibvorgängen geschriebenen Bytes.
Um eine Nachrichtentyppipeline zu erstellen, geben Sie PIPE_TYPE_MESSAGE an. Das System behandelt die in jedem Schreibvorgang geschriebenen Bytes in der Pipe als Nachrichteneinheit. Das System führt immer Schreibvorgänge für Nachrichtentyppipes durch, als ob der Schreibmodus aktiviert war.
Lesemodus
Der Lesemodus einer Pipe bestimmt, wie Daten aus einer benannten Pipe gelesen werden. Der Pipeserver gibt den anfänglichen Lesemodus für ein Pipehandle beim Aufrufen CreateNamedPipean. Daten können im Byte-Lesemodus oder im Nachrichtenlesemodus gelesen werden. Ein Handle zu einem Bytetyp-Pipe kann nur im Byte-Lesemodus verwendet werden. Ein Handle zu einer Nachrichtentyppipeline kann sich im Byte-Lese- oder Nachrichtenlesemodus befinden. Bei einer Nachrichtentyppipeline kann der Lesemodus für Server- und Clienthandles für dieselbe Pipeinstanz unterschiedlich sein.
Um den Pipehandle im Byte-Lesemodus zu erstellen, geben Sie PIPE_READMODE_BYTE an, oder verwenden Sie den Standardwert. Daten werden aus der Pipe als Bytestrom gelesen. Ein Lesevorgang wird erfolgreich abgeschlossen, wenn alle verfügbaren Bytes in der Pipe gelesen werden oder wenn die angegebene Anzahl von Bytes gelesen wird.
Um den Pipehandle im Nachrichtenlesemodus zu erstellen, geben Sie PIPE_READMODE_MESSAGE an. Daten werden aus der Pipe als Datenstrom von Nachrichten gelesen. Ein Lesevorgang wird nur erfolgreich abgeschlossen, wenn die gesamte Nachricht gelesen wird. Wenn die angegebene Anzahl der zu lesenden Bytes kleiner als die Größe der nächsten Nachricht ist, liest die Funktion so viel der Nachricht wie möglich vor dem Zurückgeben von Null (die GetLastError Funktion gibt ERROR_MORE_DATA zurück). Der Rest der Nachricht kann mit einem anderen Lesevorgang gelesen werden.
Bei einem Pipeclient befindet sich ein von CreateFile- zurückgegebener Pipehandle immer im Byte-Lesemodus. Sowohl Pipeclients als auch Pipeserver können die SetNamedPipeHandleState Funktion verwenden, um den Lesemodus eines Pipehandles zu ändern. Der Rohrziehpunkt muss über das FILE_WRITE_ATTRIBUTES Zugriffsrecht verfügen.
Wartemodus
Der Wartemodus eines Pipehandles bestimmt, wie die ReadFile-, WriteFile-und ConnectNamedPipe- Funktionen langwierige Vorgänge verarbeiten. Im Blockierungs-Wartemodus warten die Funktionen auf unbestimmte Zeit auf einen Prozess am anderen Ende der Pipe, um einen Vorgang abzuschließen. Im Nichtblocking-Wartemodus werden die Funktionen sofort in Situationen zurückgegeben, in denen andernfalls eine unbestimmte Wartezeit erforderlich wäre.
Ein ReadFile- Vorgang wird durch den Wartemodus eines Rohrziehpunkts beeinflusst, wenn die Pfeife leer ist. Bei einem Blockierungs-Wartehandle wird der Vorgang erst erfolgreich abgeschlossen, wenn Daten von einem Thread zum anderen Ende der Pipe verfügbar sind. Bei Verwendung eines Nichtblocking-Wait-Handles gibt die Funktion sofort Null zurück, und die GetLastError--Funktion gibt ERROR_NO_DATA zurück.
Ein WriteFile- Vorgangs wird durch den Wartemodus eines Rohrziehpunkts beeinflusst, wenn nicht genügend Speicherplatz im Puffer der Pipe vorhanden ist. Bei einem Blockierungs-Wait-Handle kann der Schreibvorgang erst erfolgreich ausgeführt werden, wenn genügend Speicherplatz im Puffer durch ein Threadlesevorgang vom anderen Ende der Pipe erstellt wird. Bei einem Nichtblocking-Wait-Handle gibt der Schreibvorgang sofort einen Wert ungleich Null zurück, ohne Bytes (für eine Nachrichtentyppipeline) oder nach dem Schreiben so vieler Bytes wie der Pufferspeicher (für eine Byte-Typ-Pipe) zu schreiben.
Ein ConnectNamedPipe- Vorgangs wird vom Wartemodus eines Pipehandle beeinflusst, wenn kein Client verbunden ist oder auf die Verbindung mit der Pipeinstanz wartet. Bei einem Blockierungs-Wait-Handle wird der Verbindungsvorgang erst erfolgreich ausgeführt, wenn ein Pipeclient eine Verbindung mit der Pipeinstanz herstellt, indem entweder die CreateFile-- oder CallNamedPipe--Funktion aufgerufen wird. Bei einem Nichtblocking-Wait-Handle gibt der Verbindungsvorgang sofort Null zurück, und die GetLastError--Funktion gibt ERROR_PIPE_LISTENING zurück.
Standardmäßig werden alle benannten Pipehandles, die vom CreateNamedPipe- oder CreateFile--Funktion zurückgegeben werden, mit aktivierter Blockierungswartemodus erstellt. Um die Pipe im Nichtblocking-Wartemodus zu erstellen, gibt der Pipeserver PIPE_NOWAIT an, wenn CreateNamedPipeaufgerufen wird.
Sowohl Pipeclients als auch Pipeserver können den Wartemodus eines Pipehandles ändern, indem sie entweder PIPE_WAIT oder PIPE_NOWAIT in einem Aufruf der SetNamedPipeHandleState- Funktion angeben.
Anmerkung
Der Nichtblocking-Wartemodus wird aus Gründen der Kompatibilität mit Microsoft LAN Manager, Version 2.0, unterstützt. Dieser Modus sollte nicht verwendet werden, um überlappende Eingaben und Ausgaben (E/A) mit benannten Rohren zu erzielen. Überlappende E/A sollten stattdessen verwendet werden, da zeitaufwendige Vorgänge nach dem Zurückgeben der Funktion im Hintergrund ausgeführt werden können. Weitere Informationen zu überlappenden E/A finden Sie unter Synchrone und überlappende Eingabe- und Ausgabe-.