Condividi tramite


Modalità named pipe, lettura e 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 funzioneCreateFile.

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 sulle 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à di lettura byte o in modalità di lettura messaggio. 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 alla 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 messaggio, 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 pipe, inizialmente un handle pipe restituito da CreateFile è sempre in modalità di lettura byte. Sia i client pipe che i server di pipe possono usare la funzione SetNamedPipeHandleState per modificare la modalità di lettura di un handle pipe. L'handle della pipe deve avere il diritto di accesso FILE_WRITE_ATTRIBUTES.

Modalità attesa

La modalità di attesa di un handle pipe determina il modo in cui le ReadFile, WriteFilee ConnectNamedPipe gestiscono operazioni lunghe. In modalità di attesa di blocco, le funzioni attendono indefinitamente 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 è influenzata 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 fino a quando 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 immediatamente zero e la funzioneGetLastErrorrestituisce ERROR_NO_DATA.

Un'operazione diWriteFileè influenzata 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 finché 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 è influenzata dalla modalità di attesa di un handle pipe quando non è presente alcun client connesso 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 funzioneCreateFileo CallNamedPipe. Con un handle di attesa non bloccante, l'operazione di connessione restituisce immediatamente zero e la funzioneGetLastErrorrestituisce ERROR_PIPE_LISTENING.

Per impostazione predefinita, tutti gli handle named pipe restituiti dalla CreateNamedPipe o funzione 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 di pipe che i server di 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. È consigliabile usare invece operazioni di I/O sovrapposte, perché consente 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 sincrono e sovrapposto.