Partilhar via


Operações de pipe anônimas

A função CreatePipe cria um pipe anônimo e retorna duas alças: uma alça de leitura para o pipe e uma alça de gravação para o pipe. A alça de leitura tem acesso somente leitura ao pipe e a alça de gravação tem acesso somente gravação ao pipe. Para se comunicar usando o pipe, o servidor de pipe deve passar uma alça de pipe para outro processo. Normalmente, isso é feito através de herança; ou seja, o processo permite que o identificador seja herdado por um processo filho. O processo também pode duplicar uma alça de tubo usando a função DuplicateHandle e enviá-la para um processo não relacionado usando alguma forma de comunicação entre processos, como DDE ou memória compartilhada.

Um servidor de pipe pode enviar a alça de leitura ou a alça de gravação para o cliente de pipe, dependendo se o cliente deve usar o pipe anônimo para enviar ou receber informações. Para ler a partir do tubo, use a alça de leitura do tubo em uma chamada para a função ReadFile. A chamada ReadFile retorna quando outro processo é gravado no pipe. A chamada ReadFile também pode retornar se todas as alças de gravação no pipe tiverem sido fechadas ou se ocorrer um erro antes da conclusão da operação de leitura.

Para gravar no pipe, use a alça de gravação do pipe em uma chamada para a função WriteFile. A chamada WriteFile não retorna até que tenha gravado o número especificado de bytes no pipe ou ocorra um erro. Se o buffer de pipe estiver cheio e houver mais bytes a serem gravados, WriteFile não retornará até que outro processo leia do pipe, disponibilizando mais espaço no buffer. O servidor de pipe especifica o tamanho do buffer para o pipe quando ele chama CreatePipe.

Operações assíncronas (sobrepostas) de leitura e gravação não são suportadas por pipes anônimos. Isso significa que você não pode usar o ReadFileEx e funções de WriteFileEx com pipes anônimos. Além disso, o parâmetro lpOverlapped de ReadFile e WriteFile é ignorado quando essas funções são usadas com pipes anônimos.

Existe um tubo anónimo até que todas as alças do tubo, tanto de leitura como de escrita, tenham sido fechadas. Um processo pode fechar suas alças de tubo usando a funçãoCloseHandle. Todas as alças de tubos também são fechadas quando o processo termina.

Os pipes anônimos são implementados usando um pipe nomeado com um nome exclusivo. Portanto, muitas vezes você pode passar uma alça para um pipe anônimo para uma função que requer um identificador para um pipe nomeado.