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:

  • Abra as alças retornadas pela função CreateFile . Isso inclui identificadores para arquivos, buffers de entrada do console, buffers de tela do console, pipes nomeados, dispositivos de comunicação serial e emailslots.
  • Abra identificadores para processar, thread, mutex, evento, semáforo, pipe nomeado, pipe anônimo e objetos de mapeamento de arquivo. Eles são retornados pelas funções CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipe e CreateFileMapping , 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 os identificadores 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ção SetErrorMode .
  • A máscara de afinidade do processador.
  • A associação com um trabalho.

O processo filho não herda o seguinte:

Herdando identificadores

Um processo filho pode herdar alguns dos identificadores de seus pais, 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. Normalmente, as funções de criação usam o membro bInheritHandle 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ção CreateProcess . Além disso, para herdar a entrada padrão, a saída padrão e os identificadores de erro padrão, o membro dwFlags da estrutura STARTUPINFO deve incluir STARTF_USESTDHANDLES.

Para especificar uma lista dos identificadores que devem ser herdados por um processo filho específico, chame a função UpdateProcThreadAttribute com o sinalizador PROC_THREAD_ATTRIBUTE_HANDLE_LIST .

Um identificador herdado refere-se ao mesmo objeto no processo filho que ele faz 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 identificador, o processo filho deve recuperar o valor do identificador e "saber" 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 processos.

Use a 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ção GetCurrentDirectory recupera 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ção SetCurrentDirectory .