Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O servidor de pipe controla se suas alças podem ser herdadas das seguintes maneiras:
- A funçãoCreatePipe recebe uma estrutura SECURITY_ATTRIBUTES. Se o servidor de pipe definir o bInheritHandle membro dessa estrutura como TRUE, as alças criadas por CreatePipe poderão ser herdadas.
- O servidor de pipe pode usar a função DuplicateHandle para alterar a herança de uma alça de pipe. O servidor de pipe pode criar uma duplicata não hereditária de uma alça de pipe hereditária ou uma duplicata hereditária de uma alça de pipe não herdável.
- A funçãoCreateProcess 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 tubo, o sistema permite que o processo aceda ao tubo. 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 o 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 após o processo filho ter sido criado.
- Chame a função deSetStdHandlepara definir a alça de saída padrão para a alça de gravação no pipe. Agora, o processo pai pode criar o processo filho.
- Chame o função CloseHandle para fechar a alça de gravação no pipe. Depois que o processo filho herda a alça 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çãoGetStdHandle para obter sua alça de saída padrão, que agora é uma alça 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 a criança terminar com o tubo, deve fechar a alça do tubo chamando CloseHandle ou terminando, o que fecha automaticamente a alça.
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 gravados 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 todas as alças de gravação no pipe são fechadas, 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 a alça de entrada padrão é semelhante ao procedimento para redirecionar a alça de saída padrão, exceto que a alça de leitura do tubo é usada como a alça de entrada padrão da criança. Nesse caso, o processo pai deve garantir que o processo filho não herde a alça 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 as alças padrão de um processo filho, consulte Criando um processo filho com entrada e saída redirecionadas.