Condividi tramite


Tipo di named pipe, lettura e modalità di attesa

Il server pipe specifica la modalità di tipo pipe, la modalità di lettura e la modalità di attesa nel parametro dwPipeMode della funzione CreateNamedPipe . I client pipe possono specificare queste modalità pipe per i relativi handle di pipe usando la funzione CreateFile .

Modalità tipo

La modalità di tipo di una pipe determina il modo in cui i dati vengono scritti in una named pipe. I dati possono essere trasmessi tramite una named pipe come flusso di byte o come flusso di messaggi. Il server pipe specifica il tipo di pipe quando si chiama CreateNamedPipe per creare un'istanza di una named pipe. Le modalità di tipo devono essere uguali per tutte le istanze di una pipe.

Per creare una pipe di tipo byte, specificare PIPE_TYPE_BYTE o usare il valore predefinito. I dati vengono scritti nella pipe come flusso di byte e il sistema non distingue tra i byte scritti in operazioni di scrittura diverse.

Per creare una pipe di tipo messaggio, specificare PIPE_TYPE_MESSAGE. Il sistema considera i byte scritti in ogni operazione di scrittura nella pipe come unità messaggio. Il sistema esegue sempre operazioni di scrittura su pipe di tipo messaggio come se fosse abilitata la modalità write-through.

Modalità lettura

La modalità di lettura di una pipe determina la modalità di lettura dei dati da una named pipe. Il server pipe specifica la modalità di lettura iniziale per un handle pipe quando si chiama CreateNamedPipe. I dati possono essere letti in modalità byte-read o message-read. Un handle per una pipe di tipo byte può essere in modalità di sola lettura byte. Un handle per una pipe di tipo messaggio può essere in modalità byte-read o message-read. Per una pipe di tipo messaggio, la modalità di lettura può essere diversa per gli handle server e client nella stessa istanza della pipe.

Per creare l'handle pipe in modalità di lettura byte, specificare PIPE_READMODE_BYTE o usare il valore predefinito. I dati sono letti dalla pipe come flusso di byte. Un'operazione di lettura viene completata correttamente quando tutti i byte disponibili nella pipe vengono letti o quando viene letto il numero specificato di byte.

Per creare l'handle pipe in modalità di lettura messaggi, specificare PIPE_READMODE_MESSAGE. I dati vengono letti dalla pipe come flusso di messaggi. Un'operazione di lettura viene completata correttamente solo quando viene letto l'intero messaggio. Se il numero specificato di byte da leggere è minore delle dimensioni del messaggio successivo, la funzione legge la maggior parte del messaggio possibile prima di restituire zero (la funzione GetLastError restituisce ERROR_MORE_DATA). Il resto del messaggio può essere letto usando un'altra operazione di lettura.

Per un client di pipe, inizialmente un handle di pipe restituito da CreateFile è in modalità di lettura byte. Sia i client pipe che i server pipe possono usare la funzione SetNamedPipeHandleState per modificare la modalità di lettura di un handle pipe. L'handle pipe deve avere il diritto di accesso FILE_WRITE_ATTRIBUTES.

Modalità di attesa

La modalità di attesa di un handle pipe determina il modo in cui le funzioni ReadFile, WriteFile e ConnectNamedPipe gestiscono operazioni lunghe. In modalità di attesa di blocco, le funzioni attendono per un tempo illimitato un processo sull'altra estremità della pipe per completare un'operazione. In modalità di attesa non bloccante, le funzioni restituiscono immediatamente in situazioni che altrimenti richiedono un'attesa indefinita.

Un'operazione ReadFile è interessata dalla modalità di attesa di un handle pipe quando la pipe è vuota. Con un handle di attesa di blocco, l'operazione non viene completata correttamente finché i dati non sono disponibili da un thread che scrive nell'altra estremità della pipe. Usando un handle di attesa non bloccante, la funzione restituisce zero immediatamente e la funzione GetLastError restituisce ERROR_NO_DATA.

Un'operazione WriteFile è interessata dalla modalità di attesa di un handle di pipe quando lo spazio nel buffer della pipe non è sufficiente. Con un handle di attesa di blocco, l'operazione di scrittura non riesce fino a quando non viene creato spazio sufficiente nel buffer da un thread letto dall'altra estremità della pipe. Con un handle di attesa non bloccante, l'operazione di scrittura restituisce immediatamente un valore diverso da zero, senza scrivere byte (per una pipe di tipo messaggio) o dopo la scrittura di tutti i byte contenuti nel buffer (per una pipe di tipo byte).

Un'operazione ConnectNamedPipe è interessata dalla modalità di attesa di un handle pipe quando non è connesso alcun client o è in attesa di connettersi all'istanza della pipe. Con un handle di attesa di blocco, l'operazione di connessione non riesce finché un client pipe non si connette all'istanza della pipe chiamando la funzione CreateFile o CallNamedPipe . Con un handle di attesa non bloccante, l'operazione di connessione restituisce immediatamente zero e la funzione GetLastError restituisce ERROR_PIPE_LISTENING.

Per impostazione predefinita, tutti gli handle named pipe restituiti dalla funzione CreateNamedPipe o CreateFile vengono creati con la modalità di attesa di blocco abilitata. Per creare la pipe in modalità di attesa non bloccante, il server pipe specifica PIPE_NOWAIT quando si chiama CreateNamedPipe.

Sia i client pipe che i server pipe possono modificare la modalità di attesa di un handle di pipe specificando PIPE_WAIT o PIPE_NOWAIT in una chiamata alla funzione SetNamedPipeHandleState .

Nota

La modalità di attesa non bloccante è supportata per la compatibilità con Microsoft LAN Manager versione 2.0. Questa modalità non deve essere usata per ottenere input e output sovrapposti (I/O) con named pipe. Le operazioni di I/O sovrapposte devono invece essere usate, perché consentono l'esecuzione in background di operazioni dispendiose in termini di tempo dopo la restituzione della funzione. Per altre informazioni sulle operazioni di I/O sovrapposte, vedere Input e output sincrono e sovrapposto.