Herança do identificador de pipe
O servidor de pipe controla se seus identificadores podem ser herdados das seguintes maneiras:
- A função CreatePipe recebe uma estrutura SECURITY_ATTRIBUTES . Se o servidor de pipe definir o membro bInheritHandle dessa estrutura como TRUE, os identificadores criados pelo CreatePipe poderão ser herdados.
- O servidor de pipe pode usar a função DuplicateHandle para alterar a herança de um identificador de pipe. O servidor de pipe pode criar uma duplicata não herdável de uma alça de pipe herdável ou uma duplicata herdável de uma alça de pipe não herdável.
- A função CreateProcess permite que o servidor de pipe especifique se um processo filho herda todos ou nenhum de seus identificadores herdáveis.
Quando um processo filho herda uma alça de pipe, o sistema permite que o processo acesse o pipe. No entanto, o processo pai deve comunicar o valor do identificador para o processo filho. O processo pai normalmente faz isso redirecionando o identificador de saída padrão para o processo filho, conforme mostrado nas seguintes etapas:
- Chame a função GetStdHandle para obter o identificador de saída padrão atual; salve esse identificador para que você possa restaurar o identificador de saída padrão original depois que o processo filho tiver sido criado.
- Chame a função SetStdHandle para definir o identificador de saída padrão para o identificador de gravação para o pipe. Agora, o processo pai pode criar o processo filho.
- Chame a função CloseHandle para fechar o identificador de gravação para o pipe. Depois que o processo filho herda o identificador de gravação, o processo pai não precisa mais de sua cópia.
- Chame SetStdHandle para restaurar o identificador de saída padrão original.
O processo filho usa a função GetStdHandle para obter seu identificador de saída padrão, que agora é um identificador para a extremidade de gravação de um pipe. Em seguida, o processo filho usa a função WriteFile para enviar sua saída para o pipe. Quando o filho terminar de usar o pipe, ele deverá fechar a alça do pipe chamando CloseHandle ou encerrando, o que fecha automaticamente o identificador.
O processo pai usa a função ReadFile para receber entrada do pipe. Os dados são gravados em um pipe anônimo como um fluxo de bytes. Isso significa que a leitura do processo pai de um pipe não pode distinguir entre os bytes escritos em operações de gravação separadas, a menos que os processos pai e filho usem um protocolo para indicar onde a operação de gravação termina. Quando todos os identificadores de gravação no pipe são fechados, a função ReadFile retorna zero. É importante que o processo pai feche seu identificador para a extremidade de gravação do pipe antes de chamar ReadFile. Se isso não for feito, a operação ReadFile não poderá retornar zero porque o processo pai tem um identificador aberto para a extremidade de gravação do pipe.
O procedimento para redirecionar o identificador de entrada padrão é semelhante ao para redirecionar o identificador de saída padrão, exceto que o identificador de leitura do pipe é usado como o identificador de entrada padrão do filho. Nesse caso, o processo pai deve garantir que o processo filho não herde o identificador de gravação do pipe. Se isso não for feito, a operação ReadFile executada pelo processo filho não poderá retornar zero porque o processo filho tem um identificador aberto para a extremidade de gravação do pipe.
Para obter um programa de exemplo que usa pipes anônimos para redirecionar os identificadores padrão de um processo filho, consulte Criando um processo filho com entrada e saída redirecionadas.