Ereditarietà

Un processo figlio può ereditare diverse proprietà e risorse dal processo padre. È anche possibile impedire a un processo figlio di ereditare le proprietà dal processo padre. È possibile ereditare quanto segue:

  • Handle aperti restituiti dalla funzione CreateFile . Sono inclusi handle per file, buffer di input della console, buffer dello schermo della console, named pipe, dispositivi di comunicazione seriali e mailslot.
  • Aprire handle per elaborare, thread, mutex, evento, semaforo, named-pipe, anonymous-pipe e oggetti di mapping di file. Questi vengono restituiti dalle funzioni CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipe e CreateFileMapping rispettivamente.
  • Variabili di ambiente.
  • La directory corrente.
  • La console, a meno che il processo non venga scollegato o non venga creata una nuova console. Un processo della console figlio può anche ereditare gli handle standard dell'elemento padre, nonché l'accesso al buffer di input e al buffer dello schermo attivo.
  • Modalità di errore, impostata dalla funzione SetErrorMode .
  • Maschera di affinità del processore.
  • Associazione con un processo.

Il processo figlio non eredita quanto segue:

Ereditarietà di handle

Un processo figlio può ereditare alcuni degli handle padre, ma non eredita altri. Per fare in modo che un handle venga ereditato, è necessario eseguire due operazioni:

  • Specificare che l'handle deve essere ereditato quando si crea, si apre o duplica l'handle. Le funzioni di creazione usano in genere il membro bInheritHandle di una struttura SECURITY_ATTRIBUTES a questo scopo. DuplicateHandle usa il parametro bInheritHandles .
  • Specificare che gli handle ereditabili devono essere ereditati impostando il parametro bInheritHandles su TRUE quando si chiama la funzione CreateProcess . Inoltre, per ereditare l'input standard, l'output standard e gli handle di errore standard, il membro dwFlags della struttura STARTUPINFO deve includere STARTF_USESTDHANDLES.

Per specificare un elenco degli handle che devono essere ereditati da un processo figlio specifico, chiamare la funzione UpdateProcThreadAttribute con il flag PROC_THREAD_ATTRIBUTE_HANDLE_LIST .

Un handle ereditato fa riferimento allo stesso oggetto nel processo figlio come avviee nel processo padre. Ha anche lo stesso valore e gli stessi privilegi di accesso. Pertanto, quando un processo modifica lo stato dell'oggetto, la modifica influisce su entrambi i processi. Per usare un handle, il processo figlio deve recuperare il valore dell'handle e "know" l'oggetto a cui fa riferimento. In genere, il processo padre comunica queste informazioni al processo figlio tramite la riga di comando, il blocco di ambiente o una forma di comunicazione interprocesso.

Utilizzare la funzione SetHandleInformation per controllare se un handle esistente è ereditabile o meno.

Ereditarietà delle variabili di ambiente

Un processo figlio eredita le variabili di ambiente del processo padre per impostazione predefinita. Tuttavia, CreateProcess consente al processo padre di specificare un blocco diverso di variabili di ambiente. Per altre informazioni, vedere Variabili di ambiente.

Ereditarietà della directory corrente

La funzione GetCurrentDirectory recupera la directory corrente del processo chiamante. Un processo figlio eredita la directory corrente del processo padre per impostazione predefinita. Tuttavia, CreateProcess consente al processo padre di specificare una directory corrente diversa per il processo figlio. Per modificare la directory corrente del processo chiamante, usare la funzione SetCurrentDirectory .