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 de SECURITY_ATTRIBUTES. Se o servidor de pipe definir o bInheritHandle membro dessa estrutura para TRUE, os identificadores criados por 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 um identificador 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 todas ou nenhuma de suas alças herdáveis.
Quando um processo filho herda um identificador de pipe, o sistema permite que o processo acesse o pipe. No entanto, o processo pai deve comunicar o valor do identificador ao 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 com o pipe, ele deverá fechar o identificador de pipe chamando CloseHandle ou encerrando, o que fecha automaticamente o identificador.
O processo pai usa a função ReadFile para receber a 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 o final 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 de 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 herda o identificador de gravação do pipe. Se isso não for feito, a operaçãoReadFile 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 comde entrada e saída redirecionados.