Herança
Um processo filho pode herdar várias propriedades e recursos de seu processo pai. Você também pode impedir que um processo filho herde propriedades de seu processo pai. O seguinte pode ser herdado:
- Identificadores abertos retornados pela funçãoCreateFile. Isso inclui identificadores para arquivos, buffers de entrada do console, buffers de tela do console, pipes nomeados, dispositivos de comunicação serial e mailslots.
- Abra identificadores para processar objetos de processo, thread, mutex, evento, semáforo, pipe nomeado, pipe anônimo e mapeamento de arquivos. Eles são retornados pelo CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipee CreateFileMapping funções, respectivamente.
- Variáveis de ambiente.
- O diretório atual.
- O console, a menos que o processo seja desanexado ou um novo console seja criado. Um processo de console filho também pode herdar as alças padrão do pai, bem como o acesso ao buffer de entrada e ao buffer de tela ativo.
- O modo de erro, conforme definido pela funçãoSetErrorMode.
- A máscara de afinidade do processador.
- A associação com um emprego.
O processo filho não herda o seguinte:
- Classe de prioridade.
- Identificadores retornados por LocalAlloc, GlobalAlloc, HeapCreatee HeapAlloc.
- Pseudo identificadores, como nas alças retornadas pelo GetCurrentProcess ou função GetCurrentThread. Esses identificadores são válidos apenas para o processo de chamada.
- Identificadores do módulo DLL retornados pela funçãoLoadLibrary.
- GDI ou USER manipula, como HBITMAP ou HMENU.
Herdando alças
Um processo filho pode herdar alguns dos identificadores de seu pai, mas não herdar outros. Para fazer com que um identificador seja herdado, você deve fazer duas coisas:
- Especifique que o identificador deve ser herdado quando você criar, abrir ou duplicar o identificador. As funções de criação normalmente usam o bInheritHandle membro de uma estrutura SECURITY_ATTRIBUTES para essa finalidade. DuplicateHandle usa o parâmetro bInheritHandles.
- Especifique que os identificadores herdáveis devem ser herdados definindo o parâmetro bInheritHandles como TRUE ao chamar a funçãoCreateProcess. Além disso, para herdar os identificadores de entrada, saída padrão e erro padrão, o dwFlags membro da estruturaSTARTUPINFO dodeve incluir STARTF_USESTDHANDLES.
Para especificar uma lista dos identificadores que devem ser herdados por um processo filho específico, chame a funçãoUpdateProcThreadAttributecom o sinalizador PROC_THREAD_ATTRIBUTE_HANDLE_LIST.
Um identificador herdado refere-se ao mesmo objeto no processo filho como no processo pai. Ele também tem o mesmo valor e privilégios de acesso. Portanto, quando um processo altera o estado do objeto, a alteração afeta ambos os processos. Para usar um handle, o processo filho deve recuperar o valor do identificador e "conhecer" o objeto ao qual ele se refere. Normalmente, o processo pai comunica essas informações ao processo filho por meio de sua linha de comando, bloco de ambiente ou alguma forma de comunicação entre .
Use o função SetHandleInformation para controlar se um identificador existente é herdável ou não.
Herdando variáveis de ambiente
Um processo filho herda as variáveis de ambiente de seu processo pai por padrão. No entanto, CreateProcess permite que o processo pai especifique um bloco diferente de variáveis de ambiente. Para obter mais informações, consulte variáveis de ambiente.
Herdando o diretório atual
A funçãoGetCurrentDirectory dorecupera o diretório atual do processo de chamada. Um processo filho herda o diretório atual de seu processo pai por padrão. No entanto, CreateProcess permite que o processo pai especifique um diretório atual diferente para o processo filho. Para alterar o diretório atual do processo de chamada, use a funçãoSetCurrentDirectory.