2011-07-05 5 views
7

Microsoft joué en toute sécurité ici. Dans leur article, "Creating a Child Process with Redirected Input and Output", ils disent:Est-ce que je dois fermer le handle hérité possédé ultérieurement par le processus enfant?

Les poignées ouvertes restantes sont nettoyées à la fin de ce processus.
Pour éviter les fuites de ressources dans une application plus importante, fermez les poignées explicitement.

Ce qui est parfaitement inutile. Quelles poignées? Dans quel processus?


Je veux obtenir ma tête autour d'elle. Lorsqu'un handle est créé dans le processus parent avec SECURITY_ATTRIBUTES.bInheritHandle = TRUE, un processus enfant peut le voir et l'utiliser, et le handle a la même valeur et les mêmes droits d'accès dans les deux processus.

Mais est-ce la même poignée, ou est-ce une copie qui a la même représentation numérique?

Si je passe une poignée hRead à un processus enfant afin qu'il puisse lire à partir d'un tuyau, et le processus de l'enfant ferme la poignée, dois-je aussi le fermer du processus parent? N'effacera-t-il pas le tuyau sous le processus enfant? Mes expériences montrent que CloseHandle renvoie un succès lorsque vous essayez de fermer un handle hRead transmis à l'enfant après que l'enfant l'a fermé. Cela plaide fortement pour Oui, vous devriez le fermer. Cependant, j'apprécierais un conseil plus solide ici.

Répondre

10

Vous avez frappé le clou sur la tête là-bas. Les poignées Win32 agissent en tant que références en mode utilisateur à un objet en mode noyau sous-jacent. Les handles (références) aux objets nouveaux et existants sont généralement créés via une sorte d'appel CreateXXX - des références supplémentaires peuvent être créées dans le processus actuel ou d'autres en appelant DuplicateHandle - {ou en marquant un handle comme héritable et en créant un nouveau processus - duplique un handle du processus en cours dans le processus enfant - en s'assurant que la valeur du pseudo est identique.}

A ce stade, il existe (au moins) deux références à l'objet noyau, qui doivent toutes deux être fermées à déverrouillez l'objet et libérez toutes les ressources consommées.

+0

Ah. Donc, le handle * est * cloné lorsque je génère un processus fils. C'est ce que j'étais après. – GSerg

Questions connexes