Bonjour à tous,
Je reviens sur le forum pour faire un petit appel aux spécialistes des API's de Windows. Mes questions font suite au petit développement que j'ai commencé à réaliser et que j'ai exposé dans le message
Je ne viens pas pour mon application directement car elle n'a pas suscité un grand intérêt mais, principalement, pour des fonctions générales des API's que je n'arrive pas à trouver ou à utiliser malgré le temps que je passe à lire la documentation "https://msdn.microsoft.com/en-us" et les tutoriels.
J'arrive certes à faire fonctionner mon programme mais d'une manière qui ne me convient pas car non exportable.
J'aurais donc quatre questions qui m’embarrassent:
J'ai un programme, le processus-père, qui lance un processus-fils avec la fonction API "CreatProcess(...)" :
1°) - Comment détecter dans le processus-père que le processus-fils n'existe plus ?
Je n'ai rien trouvé et n'ai pas réussi à tirer partie de la structure "PROCESS_INFORMATION".
Cette situation peut être fréquente. Si le processus-fils termine son exécution, il est indispensable que le processus-père le sache pour prendre des dispositions à savoir au moins celle de sortir à son tour. J'ai regardé du côté des process_id : je n'ai rien trouvé !...
2°) - Comment le processus-père peut-il forcer le processus-fils à terminer son exécution ?
Voire même à le tuer, ce qui ne me paraît pas très régulier. J'ai bien essayé la fonction "TerminateProcess(...)" mais elle ne reconnait pas le handle qui se trouve dans la structure "PROCESS_INFORMATION".
3°) - Comment programmer le dialogue processus-père <=> processus-fils pour que le processus-père sache que le processus-fils réclame une saisie sur le clavier ?
Cette situation existe quand le processus-père capture les fichiers standard "stdin", "stdout" et "stderr" au travers de pipes créés par la fonction "CreatePipe(...)".
Les exemples que j'ai trouvés sur la toile ne résolvent pas ce problème car les entrées/sorties sont synchrones. Il me semble que pour le résoudre, il faudrait utiliser des entrées/sorties asynchrones un peu comme sous UNIX avec la fonction "select(...)" qui existe sous les API's mais ... seulement pour le sockets !...
J'ai regardé du côté des fonctions attachées à la fonction "CreateIoCompletionPort(...)" utilisant le drapeau "OVERLAPPED" combinées :
Comment articuler tout cela ?
- d'une part, au travers des pipes créés avec la fonction "CreatePipe(...)"
- d'autre part, avec le fonctionnement des messages pour le graphique dans une boucle tournant sur la fonction "GetMessage(...)".
4°) - Par quel moyen le processus-père peut-il forcer le processus-fils à effectuer des entrées/sorties NON bufferisées ?
J'ai bien essayé par le biais des héritages mais rien n'y a fait. Pourtant, "gdb" qui utilise cette méthode de pipe "pseudo-terminaux" y parvient parfaitement.
_______________________________________
En vous remerciant par avance pour votre aide.
Bien cordialement
Lou Papet
P.S. : Le schéma ci-dessous illustre ce je pensais faire pour faire cohabiter le graphique, les pipes et le dialogue. Mais est-ce bien correct dans l'esprit des API's ?
Partager