Condividi tramite


Ereditarietà dell'handle pipe

Il server pipe controlla se i relativi handle possono essere ereditati nei modi seguenti:

  • La funzione CreatePipe riceve una struttura SECURITY_ATTRIBUTES . Se il server pipe imposta il membro bInheritHandle di questa struttura su TRUE, gli handle creati da CreatePipe possono essere ereditati.
  • Il server pipe può usare la funzione DuplicateHandle per modificare l'ereditarietà di un handle di pipe. Il server pipe può creare un duplicato nonheritable di un handle di pipe ereditabile o un duplicato ereditabile di un handle pipe nonheritable.
  • La funzione CreateProcess consente al server pipe di specificare se un processo figlio eredita tutti o nessuno dei relativi handle ereditabili.

Quando un processo figlio eredita un handle pipe, il sistema consente al processo di accedere alla pipe. Tuttavia, il processo padre deve comunicare il valore handle al processo figlio. Il processo padre esegue in genere questa operazione reindirizzando l'handle di output standard al processo figlio, come illustrato nei passaggi seguenti:

  1. Chiamare la funzione GetStdHandle per ottenere l'handle di output standard corrente; salvare questo handle in modo da poter ripristinare l'handle di output standard originale dopo la creazione del processo figlio.
  2. Chiamare la funzione SetStdHandle per impostare l'handle di output standard sull'handle di scrittura sulla pipe. Ora il processo padre può creare il processo figlio.
  3. Chiamare la funzione CloseHandle per chiudere l'handle di scrittura alla pipe. Dopo che il processo figlio eredita l'handle di scrittura, il processo padre non richiede più la copia.
  4. Chiamare SetStdHandle per ripristinare l'handle di output standard originale.

Il processo figlio usa la funzione GetStdHandle per ottenere il relativo handle di output standard, che è ora un handle alla fine di scrittura di una pipe. Il processo figlio usa quindi la funzione WriteFile per inviare il relativo output alla pipe. Al termine della pipe, l'elemento figlio deve chiudere l'handle di pipe chiamando CloseHandle o terminando, che chiude automaticamente l'handle.

Il processo padre usa la funzione ReadFile per ricevere l'input dalla pipe. I dati sono scritti in una pipe anonima come flusso di byte. Ciò significa che la lettura del processo padre da una pipe non può distinguere tra i byte scritti in operazioni di scrittura separate, a meno che i processi padre e figlio non usino un protocollo per indicare dove termina l'operazione di scrittura. Quando tutti gli handle di scrittura nella pipe vengono chiusi, la funzione ReadFile restituisce zero. È importante che il processo padre chiuda il relativo handle alla fine di scrittura della pipe prima di chiamare ReadFile. Se questa operazione non viene eseguita, l'operazione ReadFile non può restituire zero perché il processo padre ha un handle aperto alla fine di scrittura della pipe.

La procedura per il reindirizzamento dell'handle di input standard è simile a quella per il reindirizzamento dell'handle di output standard, ad eccezione del fatto che l'handle di lettura della pipe viene usato come handle di input standard dell'elemento figlio. In questo caso, il processo padre deve garantire che il processo figlio non erediti l'handle di scrittura della pipe. Se questa operazione non viene eseguita, l'operazione ReadFile eseguita dal processo figlio non può restituire zero perché il processo figlio ha un handle aperto alla fine di scrittura della pipe.

Per un programma di esempio che usa pipe anonime per reindirizzare gli handle standard di un processo figlio, vedere Creazione di un processo figlio con input e output reindirizzati.