Compartilhar via


Tipos de pipe nomeados, modos de leitura e espera

O servidor de pipe especifica o modo de tipo de pipe, o modo de leitura e o modo de espera no parâmetro dwPipeMode da função CreateNamedPipe . Os clientes de pipe podem especificar esses modos de pipe para seus identificadores 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 por meio 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 pipe.

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 escritos 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 um identificador de pipe ao chamar CreateNamedPipe. Os dados podem ser lidos no modo de leitura de bytes ou no modo de leitura de mensagem. Um identificador para um pipe do tipo byte só pode estar no modo de leitura de bytes. Um identificador para um pipe do tipo mensagem pode estar no modo byte-read ou message-read. 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 toda a mensagem é lida. Se o número especificado de bytes a serem lidos for menor que o tamanho da próxima mensagem, a função lerá o máximo possível da mensagem antes de retornar zero (a função GetLastError retornará ERROR_MORE_DATA). O restante da mensagem pode ser lido usando outra operação de leitura.

Para um cliente de pipe, um identificador de pipe retornado por CreateFile está sempre no modo de leitura de bytes inicialmente. Os clientes de pipe e os servidores de pipe podem usar a função SetNamedPipeHandleState para alterar o modo de leitura de um identificador de pipe. O identificador de pipe deve ter o acesso FILE_WRITE_ATTRIBUTES correto.

Modo de Espera

O modo de espera de um identificador de pipe determina como as funções ReadFile, WriteFile e ConnectNamedPipe lidam com operações longas. No modo de espera de bloqueio, as funções esperam indefinidamente por um processo na outra extremidade do pipe 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 pipe quando o pipe está vazio. Com um identificador de espera de bloqueio, a operação não é concluída com êxito até que os dados sejam disponibilizados de um thread gravando na outra extremidade do pipe. Usando um identificador de espera sem bloqueio, a função retorna zero imediatamente e a função GetLastError retorna ERROR_NO_DATA.

Uma operação WriteFile é afetada pelo modo de espera de uma alça de pipe quando não há espaço suficiente no buffer do pipe. Com um identificador de espera de bloqueio, a operação de gravação não pode ter êxito até que um espaço suficiente seja criado no buffer por um thread lendo 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 bytes (para um pipe do tipo mensagem) ou depois de gravar tantos bytes quanto o buffer contém (para um pipe do tipo byte).

Uma operação ConnectNamedPipe é afetada pelo modo de espera de um identificador de pipe quando não há nenhum cliente conectado ou aguardando para se conectar à instância de pipe. Com um identificador de espera de bloqueio, a operação de conexão não é bem-sucedida até que um cliente de pipe se conecte à instância de pipe chamando a função CreateFile ou CallNamedPipe . Com um identificador de espera sem bloqueio, a operação de conexão retorna zero imediatamente e a função GetLastError retorna ERROR_PIPE_LISTENING.

Por padrão, todas as alças de pipe nomeadas retornadas pela função CreateNamedPipe ou CreateFile são criadas com o modo de espera de bloqueio 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 um identificador de pipe especificando PIPE_WAIT ou PIPE_NOWAIT em uma chamada para a função SetNamedPipeHandleState .

Observação

O modo de espera sem bloqueio tem suporte para compatibilidade com o Microsoft LAN Manager versão 2.0. Esse modo não deve ser usado para obter entrada e saída sobrepostas (E/S) 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 Entrada e saída síncronas e sobrepostas.