Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1470 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Communication processus sous windows[Resolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Communication processus sous windows[Resolu]

n°987159
zapan666
Tout est relatif
Posté le 19-02-2005 à 17:40:05  profilanswer
 

Bonjour,  
 
Je dois réaliser un petit programme qui fait communiquer deux processus :  
 
Le processus fils est un simple programme qui mets en majuscule ce qu'il reçoit sur l'entrée standard & ecrit sur la sortie standart la même chose, mais en majuscule. (ça, normalement, ça mache)
 
Vient ensuite le processus père : il demande juste une chaine de caractère & envoit ça au processus fils, mais j'ai l'impression que la fonction CreateProcess ne redirige pas correctement mes tubes
(c-a-d que le pipe1 doit devenir l'entré standard du processus, & le pipe2 la sortie standard) & du coup ça marche pas... (mon filtre se lance & attend une entrée que je dois fournir au clavier....)
 
Donc, pensez vous que mon CreateProcess (ligne 22 du main) est mal utilisé ? Si c'est le cas, comment faire pour que mes tubes deviennent les entrées & sorties standard de mon filtre.(Pourtant, j'ai indiqué au CreateProcess de faire hériter les tubes...)
 
Merci
 
Code du processus père
 
Fonction d'écriture dans les tubes  

Code :
  1. BOOL litDansTube( HANDLE pipe, char chaine[LG_MAX], DWORD *taille) {
  2. int tailleChaine = strlen(chaine);
  3. return ReadFile (pipe, chaine, tailleChaine*sizeof(char) , taille, NULL);   
  4. }
  5. BOOL ecritDansTube(HANDLE pipe, char chaine[LG_MAX], DWORD *taille) {
  6. return WriteFile(pipe, chaine, strlen(chaine) * sizeof(char), taille, NULL);
  7. }


 

Code :
  1. int main() {
  2. DWORD i = 0;
  3. DWORD taille = 0;
  4. char chaine[LG_MAX];
  5. HANDLE lecture1;
  6. HANDLE ecriture1;
  7. HANDLE lecture2;
  8. HANDLE ecriture2;
  9. STARTUPINFO si;
  10. PROCESS_INFORMATION pi;
  11.     initialisationHandle(&lecture1, &ecriture1);
  12.     initialisationHandle(&lecture2, &ecriture2);
  13. GetStartupInfo(&si);
  14. si.hStdInput = lecture1;
  15. si.hStdOutput = ecriture2;
  16. if ( !CreateProcess("../fils_win/maj.exe", NULL,
  17.     NULL, NULL,
  18.     TRUE,
  19.     CREATE_NEW_CONSOLE, NULL, NULL,
  20.     &si, &pi)) {
  21.  printf("CreateProcess : Failed" );
  22.  return 1;
  23. }
  24. printf("Chaine a mettre en maj ?\n" );
  25. gets(chaine);
  26. fprintf(stderr, "Taille de la chaine %s : %d\n", chaine, strlen(chaine));
  27. if ( !ecritDansTube(ecriture1, chaine, &taille)) {
  28.  fprintf(stderr, "Erreur lors de l'ecriture dans le tube\n" );
  29.  return 1;
  30. }
  31. litDansTube(lecture2, chaine, &taille);
  32. printf("Res : %d \n", chaine);
  33. fermeHandle(&ecriture1);
  34. fermeHandle(&lecture1);
  35. fermeHandle(&ecriture2);
  36. fermeHandle(&lecture2);
  37.     return 0;
  38. } // main


Message édité par zapan666 le 20-02-2005 à 17:08:18
mood
Publicité
Posté le 19-02-2005 à 17:40:05  profilanswer
 

n°987309
HelloWorld
Salut tout le monde!
Posté le 20-02-2005 à 00:04:35  profilanswer
 

CreateProcess ne redirige rien, au mieux il s'occupe de dupliquer les handles.
Donc c'est plutot le code de initialisationHandle qu'il faudrait voir.
Je me demande aussi l'utilité de ta fonction fermeHandle, un CloseHandle ne suffit pas ?
Rediriger les E/S avec les pipes c'est assez complexe, car y'a une gymnastique à faire au niveau des handle afin de ne pas tous les faire hériter car ça peut poser des problèmes pour détecter la fermeture du pipe notamment. Mais heureusement tu as un articles qui te donne tout le code pour faire ça proprement:
http://support.microsoft.com/defau [...] -us;190351


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°987729
zapan666
Tout est relatif
Posté le 20-02-2005 à 17:07:44  profilanswer
 

HelloWorld a écrit :

CreateProcess ne redirige rien, au mieux il s'occupe de dupliquer les handles.
Donc c'est plutot le code de initialisationHandle qu'il faudrait voir.
Je me demande aussi l'utilité de ta fonction fermeHandle, un CloseHandle ne suffit pas ?
Rediriger les E/S avec les pipes c'est assez complexe, car y'a une gymnastique à faire au niveau des handle afin de ne pas tous les faire hériter car ça peut poser des problèmes pour détecter la fermeture du pipe notamment. Mais heureusement tu as un articles qui te donne tout le code pour faire ça proprement:
http://support.microsoft.com/defau [...] -us;190351


Et bien merci, ça m'a bien aider
(je me suis aussi servit de http://msdn.microsoft.com/library/ [...] cesses.asp )
 
Mon erreur était donc la non duplication des tubes de lecture & ecriture du processus père (donc j'envoyais rien au fils...) & aussi, tjrs dans le père, l'initialisation de la structure STARTUPINFO était mal faite...
 
 
Et pour le fils, bah, j'ai fais 1 autre erreur : a la place d'un pointeur, j'ai mis un NULL donc plantage du processus fils (pourtant, quand il marchait seul, ça marchait bien...)
 
Encore Merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Communication processus sous windows[Resolu]

 

Sujets relatifs
Jai perdu ma source + prob ouvrir nouvelle fenetre [Resolu][Java] Dessin dans un buffer affiché par paint => problème RESOLU
[Résolu !] liste déroulante dépendante (valeur non gardée)[Brainstorming] Communication entre Programme C & Java
effacer fichier sous Windows[C#/VB.NET] [Résolu] Equivalent de GetObject ?
[resolu]Texte inséré automatiquement dans formulairepb avec une chaine de caractères [RESOLU]
Connexion à MySQL [RESOLU]Syntaxe de l'évènement onclick! [RESOLU]
Plus de sujets relatifs à : [C] Communication processus sous windows[Resolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR