Named Pipe-Typ, Lese- und Wartemodus
Der Pipeserver gibt den Pipetypmodus, den Lesemodus und den Wartemodus im dwPipeMode-Parameter der CreateNamedPipe-Funktion an. Pipeclients können diese Pipemodi für ihre Pipehandles mithilfe der CreateFile-Funktion angeben.
Typmodus
Der Typmodus einer Pipe bestimmt, wie Daten in eine Named Pipe geschrieben werden. Daten können über eine Named Pipe entweder als Bytestrom oder als Nachrichtenstrom übertragen werden. Der Pipeserver gibt den Pipetyp an, wenn CreateNamedPipe aufgerufen wird, um eine instance einer Named Pipe zu erstellen. Die Typmodi müssen für alle Instanzen einer Pipe identisch sein.
Um eine Bytetyppipe zu erstellen, 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 Bytes, die in verschiedenen Schreibvorgängen geschrieben wurden.
Geben Sie zum Erstellen einer Nachrichtentyppipe PIPE_TYPE_MESSAGE an. Das System behandelt die Bytes, die in jedem Schreibvorgang in die Pipe geschrieben werden, als Nachrichteneinheit. Das System führt schreibvorgänge für Nachrichtentyppipes immer so aus, als ob der Schreibzugriffsmodus aktiviert wäre.
Lesemodus
Der Lesemodus einer Pipe bestimmt, wie Daten aus einer Named Pipe gelesen werden. Der Pipeserver gibt den anfänglichen Lesemodus für ein Pipehandle an, wenn CreateNamedPipe aufgerufen wird. Daten können im Bytelesemodus oder im Nachrichtenlesemodus gelesen werden. Ein Handle für eine Bytetyppipe kann sich nur im Byte-Lesemodus befinden. Ein Handle für eine Nachrichtentyppipe kann sich entweder im Byte-Lese- oder Nachrichtenlesemodus befinden. Bei einer Nachrichtentyppipe kann sich der Lesemodus für Server- und Clienthandles für dieselbe Pipe instance unterscheiden.
Um das Pipehandle im Bytelesmodus 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 das Pipehandle im Nachrichtenlesemodus zu erstellen, geben Sie PIPE_READMODE_MESSAGE an. Daten werden aus der Pipe als Nachrichtenstrom 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 wie möglich von der Nachricht, bevor sie null zurückgibt (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ückgegebenes Pipehandle zunächst immer im Byte-Lesemodus. Sowohl Pipeclients als auch Pipeserver können die SetNamedPipeHandleState-Funktion verwenden, um den Lesemodus eines Pipehandles zu ändern. Das Pipehandle muss über das Zugriffsrecht FILE_WRITE_ATTRIBUTES verfügen.
Wartemodus
Der Wartemodus eines Pipehandles bestimmt, wie die Funktionen ReadFile, WriteFile und ConnectNamedPipe langwierige Vorgänge verarbeiten. Im Blockierungs-Wartemodus warten die Funktionen unbegrenzt, bis ein Prozess am anderen Ende der Pipe einen Vorgang abgeschlossen hat. Im Nichtblocking-Wartemodus werden die Funktionen sofort in Situationen zurückgegeben, die andernfalls eine unbegrenzte Wartezeit erfordern würden.
Ein ReadFile-Vorgang wird vom Wartemodus eines Pipehandles beeinflusst, wenn die Pipe leer ist. Mit einem Blockierungs-Wartehandle wird der Vorgang erst erfolgreich abgeschlossen, wenn Daten aus einem Thread verfügbar sind, der an das andere Ende der Pipe schreibt. Mit einem Handle ohne Blockierung und Wartezeit gibt die Funktion sofort null zurück, und die GetLastError-Funktion gibt ERROR_NO_DATA zurück.
Ein WriteFile-Vorgang wird vom Wartemodus eines Pipehandles beeinflusst, wenn im Puffer der Pipe nicht genügend Speicherplatz vorhanden ist. Bei einem Blockierungs-Wartehandle kann der Schreibvorgang erst erfolgreich ausgeführt werden, wenn genügend Speicherplatz im Puffer durch einen Thread vom anderen Ende der Pipe erstellt wird. Bei einem Handle ohne Blockierung und Wartezeit gibt der Schreibvorgang einen Wert ungleich null sofort zurück, ohne Bytes (für eine Nachrichtentyppipe) oder nach dem Schreiben so vieler Bytes, wie der Puffer enthält (für eine Bytetyppipe).
Ein ConnectNamedPipe-Vorgang wird vom Wartemodus eines Pipehandles beeinflusst, wenn kein Client verbunden ist oder darauf wartet, eine Verbindung mit der Pipe herzustellen, instance. Mit einem Blockierungs-Wartehandle ist der Verbindungsvorgang erst erfolgreich, wenn ein Pipeclient eine Verbindung mit der Pipe instance, indem entweder die CreateFile- oder CallNamedPipe-Funktion aufgerufen wird. Bei einem Handle ohne Blockierung und Wartezeit gibt der Verbindungsvorgang sofort null zurück, und die GetLastError-Funktion gibt ERROR_PIPE_LISTENING zurück.
Standardmäßig werden alle Named Pipe-Handles, die von der CreateNamedPipe - oder CreateFile-Funktion zurückgegeben werden, mit aktiviertem Blockierungsmodus erstellt. Um die Pipe im Nichtblockierungs-Wartemodus zu erstellen, gibt der Pipeserver beim Aufrufen von CreateNamedPipe PIPE_NOWAIT an.
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.
Hinweis
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 Named Pipes zu erzielen. Stattdessen sollten überlappende E/A-Vorgänge verwendet werden, da dadurch zeitaufwendige Vorgänge im Hintergrund ausgeführt werden können, nachdem die Funktion zurückgegeben wurde. Weitere Informationen zu überlappenden E/A-Vorgängen finden Sie unter Synchrone und überlappende Eingabe und Ausgabe.