Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

père / fils createprocess (aidez moi)

2 réponses
Avatar
el7akika
bonjour,

je veux faire une communication entre simulink (simulateur 1 le père)
et un goldengate (simulateur 2 le fils ) .

j'ai commencé à faire un programme dans simulink pour gérer goldengate

j'utilise createpipe (deux pipes) et createprocess (pour créer le fils
(goldengate))
en utilisant pipes anonymes

simulink écrire -----> lire goldengate
lire <----- écrire

mais je ne sais pas comment ça marche, je ne veux pas que la
communication entre ces deux process soit avec stdin et stdout car le
fils utilise stdout pour lancer son programme
avez vous une idée ?
je vous remercie d'avance

2 réponses

Avatar
Frédéric Lachasse
"el7akika" wrote in message
news:
bonjour,

je veux faire une communication entre simulink (simulateur 1 le père)
et un goldengate (simulateur 2 le fils ) .

j'ai commencé à faire un programme dans simulink pour gérer goldengate

j'utilise createpipe (deux pipes) et createprocess (pour créer le fils
(goldengate))
en utilisant pipes anonymes

simulink écrire -----> lire goldengate
lire <----- écrire

mais je ne sais pas comment ça marche, je ne veux pas que la
communication entre ces deux process soit avec stdin et stdout car le
fils utilise stdout pour lancer son programme
avez vous une idée ?



Ce que je sais:
- Il faut faire le CreateProcess avec bInheritHandles à TRUE.
- Les handles de fichier (ici les pipes) doivent être héritables.
- Fermer tous les handles qui ne seront plus utilisé.
Ce dont je suis moins sûr:
- Les handles héritables sont dupliquées au moment du CreateProcess. Les
handles dupliqués vont avoir (je crois) la même valeur dans les deux
process, et il faut un moyen de passer cette valeur du process père au
process fils (ceci n'est pas nécessaire si on redirige les flux standards).

On peut créer des handles héritables avec CreatePipe() en utilisant une
structure SECURITY_ATTRIBUTES, mais je préfère faire un DuplicateHandle du
handle que je faire hériter. Cela me permet de choisir les handles qui vont
être hérités (sinon CreatePipe() va rendre héritable les 2 côtés du pipe),
et d'éviter de garder des handles ouverts. Une lecture sur un pipe peut
détecter que le côté écriture du pipe a été fermé. Mais si le handle
écriture est dupliqué dans l'autre process, il va rester ouvert, et le
process lecture va bloqué sur la lecture en pensant que des données peuvent
encore arriver.

Donc, ce que je conseille:
- CreatePipe() avec SECURITY_ATTRIBUTE à NULL. On a 2 handles, un sera
utiliser par le père, l'autre doit être transmis au fils.
- DuplicateHandle() pour créer un handle héritable du handle fils.
- CloseHandle() du handle que l'on vient de dupliquer (seul le duplicata
héritable sera utilisé)
- CreateProcess() avec passage en argument de la valeur du handle fils
- CloseHandle() du handle fils dans le process père (le CreateProcess a
créé un nouveau handle dans le process fils)

Le process fils, lui, extrait la valeur du handle de la ligne de commande et
utilise le handle directement.

(J'ai donné la méthode avec un seul pipe, mais bien sûr, il est très facile
d'étendre le pricipe avec plusieurs)

--
Frédéric Lachasse - ECP86
Avatar
Dominique Vaufreydaz
Bonjour,

je veux faire une communication entre simulink (simulateur 1 le père)
et un goldengate (simulateur 2 le fils ) .
j'ai commencé à faire un programme dans simulink pour gérer goldengate



Va chercher bonheur ( c'est a dire CRedirect) sur www.codeguru.com

Doms.
--
Impose ta chance, serre ton bonheur et va vers ton risque.
A te regarder, ils s'habitueront.
René Char, Les Matinaux.
----
http://Dominique.Vaufreydaz.free.fr/
http://TitchKaRa.free.fr/
http://logiciels.ntfaqfr.com/