Question

Lors de la création d'un processus enfant en C ++ en utilisant l'API de Windows, on peut permettre à l'héritage des poignées de parent à enfant. Dans un exemple Microsoft "Création d'un processus enfant avec entrée et redirigée sortie ", la redirection d'un processus enfant std in / out aux tuyaux créés par le parent, il est nécessaire de permettre l'héritage pour les tuyaux de redirection pour être utilisable.

Je travaille sur une petite classe de démonstration qui lance un exécutable externe, lit la sortie, et crache ensuite à l'appelant (qui enregistre la sortie de retour dans un fichier). Je suis en train de construire dans une fonction time-out, où il bloque seulement pour un certain laps de temps avant d'appeler TerminateProcess() sur l'enfant et de continuer sur la vie.

Cependant, j'ai trouvé qu'en permettant l'héritage de la poignée, le processus de l'enfant a également une poignée (visible par Process Explorer ) dans le fichier de sortie. Je ne veux pas que le processus de l'enfant pour obtenir cette poignée, mais le parent dans ce cas (cette classe de démonstration) n'a pas connaissance de la poignée soit, donc je ne peux pas utiliser actuellement SetHandleInformation() pour démarquer le fichier de sortie spécifique à exclure de l'héritage.

Je suis certain qu'il doit y avoir une meilleure façon d'hériter seulement les poignées spécifiques que je veux, sans permettre l'héritage de « couverture » qui passe poignées et non intentionnelles indésirables. Malheureusement, je suis incapable de trouver une solution, après avoir parcouru autant d'articles MSDN connexes que je peux trouver, et moi-même avoir googlé dans un état de découragement.

À tout le moins, je dois faire quelque chose pour enlever les poignées de l'enfant, sans nécessairement avoir les poignées dans la classe de démonstration (ils sont utilisés par la classe d'appel, et cette démo classe n'a pas connaissance explicite de leur existence).

Les solutions pour héritage plus sélectif? Je suis particulièrement intéressé par la solution qui me permet de déclarer spécifiquement ce qui traite d'hériter, et toutes les poignées indiqué un-ne sont transmissibles par hérédité, si une telle solution existe.

Merci de bien vouloir.

Était-ce utile?

La solution

Si le descripteur de fichier de sortie est héritée par le processus de l'enfant, alors c'est parce que le code dans le processus parent l'a ouvert le fichier explicitement indiqué que le descripteur de fichier doit être héritable. Il a passé une valeur pour le paramètre de lpSecurityAttributes CreateFile . L'état par défaut est la poignée pas être héritable.

Il me semble que votre classe de processus de création ne devrait pas essayer de deviner son interlocuteur, qui a déjà ouvert le fichier.

Cependant, si vous avez des connaissances particulières exactement qui gère les nouveaux besoins de processus, alors que de Windows Vista, il existe un mécanisme permettant de spécifier les poignées doivent être héritées. Lorsque vous vous préparez à appeler CreateProcess, utilisez une structure STARTUPINFOEX au lieu de la STARTUPINFO habituelle. Il a un membre de lpAttributeList. Allouer et initialiser, puis utilisez UpdateProcThreadAttribute avec PROC_THREAD_ATTRIBUTE_HANDLE_LIST pour définir la liste des poignées pour être héritée. Toutes les poignées doivent être héritable, et vous devez toujours spécifier bInheritHandles = true lorsque vous appelez CreateProcess. Vous devez également inclure EXTENDED_STARTUPINFO_PRESENT dans le paramètre dwCreationFlags. Raymond Chen a démontré la technique dans un article en 2011.

Si cette fonctionnalité est ajoutée pas disponible pour vous, alors vous pourriez certainement essayer de [énumérer toutes les poignées ouvertes de votre programme] et définissez leurs propriétés d'héritage avec

Autres conseils

Vous pouvez utiliser SetHandleInformation pour effacer le bit HANDLE_FLAG_INHERIT sur votre poignée de sortie, cela empêchera le processus de l'enfant de l'hériter.

  

Si cette option est activée, un processus enfant créé avec le paramètre bInheritHandles de CreateProcess réglé sur TRUE héritera la poignée d'objets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top