Partilhar via


Tipo de pipe nomeado, modos de leitura e espera

O servidor de pipe especifica o modo de tipo de pipe, modo de leitura e modo de espera no parâmetro dwPipeMode da funçãoCreateNamedPipe. Os clientes de pipe podem especificar esses modos de pipe para suas alças de pipe usando a função CreateFile.

Modo de Tipo

O modo de tipo de um pipe determina como os dados são gravados em um pipe nomeado. Os dados podem ser transmitidos através de um pipe nomeado como um fluxo de bytes ou como um fluxo de mensagens. O servidor de pipe especifica o tipo de pipe ao chamar CreateNamedPipe para criar uma instância de um pipe nomeado. Os modos de tipo devem ser os mesmos para todas as instâncias de um tubo.

Para criar um pipe do tipo byte, especifique PIPE_TYPE_BYTE ou use o valor padrão. Os dados são gravados no pipe como um fluxo de bytes, e o sistema não diferencia entre os bytes gravados em diferentes operações de gravação.

Para criar um pipe do tipo mensagem, especifique PIPE_TYPE_MESSAGE. O sistema trata os bytes gravados em cada operação de gravação no pipe como uma unidade de mensagem. O sistema sempre executa operações de gravação em pipes do tipo mensagem como se o modo de gravação estivesse habilitado.

Modo de leitura

O modo de leitura de um pipe determina como os dados são lidos de um pipe nomeado. O servidor de pipe especifica o modo de leitura inicial para uma alça de pipe ao chamar CreateNamedPipe. Os dados podem ser lidos no modo de leitura de bytes ou no modo de leitura de mensagens. Um identificador para um pipe do tipo byte pode estar apenas no modo de leitura de bytes. Um identificador para um pipe de tipo de mensagem pode estar no modo de leitura de bytes ou de leitura de mensagem. Para um pipe do tipo mensagem, o modo de leitura pode ser diferente para identificadores de servidor e cliente para a mesma instância de pipe.

Para criar o identificador de pipe no modo de leitura de bytes, especifique PIPE_READMODE_BYTE ou use o valor padrão. Os dados são lidos do pipe como um fluxo de bytes. Uma operação de leitura é concluída com êxito quando todos os bytes disponíveis no pipe são lidos ou quando o número especificado de bytes é lido.

Para criar o identificador de pipe no modo de leitura de mensagem, especifique PIPE_READMODE_MESSAGE. Os dados são lidos do pipe como um fluxo de mensagens. Uma operação de leitura é concluída com êxito somente quando a mensagem inteira é lida. Se o número especificado de bytes para ler for menor do que o tamanho da próxima mensagem, a função lê o máximo possível da mensagem antes de retornar zero (a função GetLastError retorna ERROR_MORE_DATA). O restante da mensagem pode ser lido usando outra operação de leitura.

Para um cliente de pipe, uma alça de pipe retornada por CreateFile está sempre no modo de leitura de bytes inicialmente. Os clientes de pipe e os servidores de pipe podem usar a funçãoSetNamedPipeHandleState dopara alterar o modo de leitura de uma alça de pipe. A alça do tubo deve ter o direito de acesso FILE_WRITE_ATTRIBUTES.

Modo de espera

O modo de espera de uma alça de pipe determina como as funções ReadFile, WriteFilee ConnectNamedPipe lidam com operações demoradas. No modo de bloqueio-espera, as funções aguardam indefinidamente por um processo na outra extremidade do tubo para concluir uma operação. No modo de espera sem bloqueio, as funções retornam imediatamente em situações que, de outra forma, exigiriam uma espera indefinida.

Uma operação ReadFile é afetada pelo modo de espera de uma alça de tubo quando o tubo está vazio. Com uma alça de espera de bloqueio, a operação não é concluída com êxito até que os dados estejam disponíveis a partir de uma gravação de thread na outra extremidade do tubo. Usando uma alça de espera sem bloqueio, a função retorna zero imediatamente e a funçãoGetLastError retorna ERROR_NO_DATA.

Uma operação deWriteFileé afetada pelo modo de espera de uma alça de tubo quando não há espaço suficiente no buffer do pipe. Com uma alça de bloqueio-espera, a operação de gravação não pode ser bem-sucedida até que espaço suficiente seja criado no buffer por uma leitura de thread da outra extremidade do pipe. Com um identificador de espera sem bloqueio, a operação de gravação retorna um valor diferente de zero imediatamente, sem gravar nenhum byte (para um pipe do tipo mensagem) ou depois de gravar tantos bytes quanto o buffer mantém (para um pipe do tipo byte).

Uma operação deConnectNamedPipeé afetada pelo modo de espera de uma alça de pipe quando não há nenhum cliente conectado ou aguardando para se conectar à instância do pipe. Com uma alça de bloqueio-espera, a operação de conexão não terá êxito até que um cliente de pipe se conecte à instância de pipe chamando aCreateFileou função de CallNamedPipe. Com um identificador de espera sem bloqueio, a operação de conexão retorna zero imediatamente e a funçãoGetLastError retorna ERROR_PIPE_LISTENING.

Por padrão, todas as alças de pipe nomeadas retornadas pelo CreateNamedPipe ou função de CreateFile são criadas com o modo de bloqueio e espera habilitado. Para criar o pipe no modo de espera sem bloqueio, o servidor de pipe especifica PIPE_NOWAIT ao chamar CreateNamedPipe.

Os clientes de pipe e os servidores de pipe podem alterar o modo de espera de uma alça de pipe especificando PIPE_WAIT ou PIPE_NOWAIT em uma chamada para a funçãoSetNamedPipeHandleState.

Observação

O modo nonblocking-wait é suportado para compatibilidade com o Microsoft LAN Manager versão 2.0. Este modo não deve ser usado para obter entradas e saídas (E/S) sobrepostas com pipes nomeados. Em vez disso, a E/S sobreposta deve ser usada, pois permite que operações demoradas sejam executadas em segundo plano após o retorno da função. Para obter mais informações sobre E/S sobrepostas, consulte de entrada e saída síncrona e sobreposta.