[C] Communication processus sous windows[Resolu]

Communication processus sous windows[Resolu] [C] - C - Programmation

Marsh Posté le 19-02-2005 à 17:40:05    

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
Reply

Marsh Posté le 19-02-2005 à 17:40:05   

Reply

Marsh Posté le 20-02-2005 à 00:04:35    

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
Reply

Marsh Posté le 20-02-2005 à 17:07:44    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed