Héritage de handle de canal
Le serveur de canaux contrôle si ses Handles peuvent être hérités des manières suivantes :
- La fonction CreatePipe reçoit une structure d' _ attributs de sécurité . Si le serveur de canal affecte la valeur true au membre bInheritHandle de cette structure, les descripteurs créés par CreatePipe peuvent être hérités.
- Le serveur de canal peut utiliser la fonction DuplicateHandle pour modifier l’héritage d’un handle de canal. Le serveur de canaux peut créer un doublon non héritable d’un handle de canal héritable ou un doublon pouvant être hérité d’un handle de canal non héritable.
- La fonction CreateProcess permet au serveur de canal de spécifier si un processus enfant hérite de tout ou partie de ses Handles pouvant être hérités.
Lorsqu’un processus enfant hérite d’un handle de canal, le système permet au processus d’accéder au canal. Toutefois, le processus parent doit communiquer la valeur du handle au processus enfant. Le processus parent effectue généralement cette opération en redirigeant le descripteur de sortie standard vers le processus enfant, comme indiqué dans les étapes suivantes :
- Appelez la fonction GetStdHandle pour récupérer le handle de sortie standard actuel ; Enregistrez ce handle pour pouvoir restaurer le descripteur de sortie standard d’origine après la création du processus enfant.
- Appelez la fonction SetStdHandle pour définir le handle de sortie standard du handle d’écriture sur le canal. Désormais, le processus parent peut créer le processus enfant.
- Appelez la fonction CloseHandle pour fermer le handle d’écriture sur le canal. Une fois que le processus enfant hérite du handle d’écriture, le processus parent n’a plus besoin de sa copie.
- Appelez SetStdHandle pour restaurer le descripteur de sortie standard d’origine.
Le processus enfant utilise la fonction GetStdHandle pour obtenir son descripteur de sortie standard, qui est maintenant un handle vers la fin d’écriture d’un canal. Le processus enfant utilise ensuite la fonction WriteFile pour envoyer sa sortie vers le canal. Lorsque l’enfant a terminé avec le canal, il doit fermer le handle de canal en appelant CloseHandle ou en terminant, ce qui ferme automatiquement le handle.
Le processus parent utilise la fonction ReadFile pour recevoir l’entrée du canal. Les données sont écrites dans un canal anonyme en tant que flux d’octets. Cela signifie que le processus parent lisant à partir d’un canal ne peut pas faire la distinction entre les octets écrits dans des opérations d’écriture distinctes, à moins que les processus parent et enfant utilisent un protocole pour indiquer l’emplacement de fin de l’opération d’écriture. Lorsque tous les descripteurs d’écriture du canal sont fermés, la fonction ReadFile retourne la valeur zéro. Il est important que le processus parent ferme son handle à la fin d’écriture du canal avant d’appeler ReadFile. Si ce n’est pas le cas, l’opération ReadFile ne peut pas retourner la valeur zéro, car le processus parent a un handle ouvert à la fin d’écriture du canal.
La procédure de redirection du handle d’entrée standard est semblable à celle utilisée pour rediriger le descripteur de sortie standard, à la différence près que le handle de lecture du canal est utilisé comme handle d’entrée standard de l’enfant. Dans ce cas, le processus parent doit s’assurer que le processus enfant n’hérite pas du handle d’écriture du canal. Si ce n’est pas le cas, l’opération ReadFile effectuée par le processus enfant ne peut pas retourner la valeur zéro, car le processus enfant a un handle ouvert à la fin d’écriture du canal.
Pour obtenir un exemple de programme qui utilise des canaux anonymes pour rediriger les handles standard d’un processus enfant, consultez création d’un processus enfant avec une entrée et une sortie redirigées.