bonjour à tous,

Je travvaille en C sur linux
le but de mon programme est de créer un 2 pipes vers un programme de façon a ce que ce programme lise des données sur stdin et renvois des données sur stdout
j'ai réussit dans le cas ou je n'ai qu'une trame a envoyé et ça se complique lorsque j'en envois plusieurs voila les 2 programme que j'ai écrit

le programme qui recoit par stdin et renvois par stdout
je l'ai nommé readStd

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
int main ()
{
  //receive message data 
  char inbuff[10000];
 
  // receive the message though stdin
 while (fgets (inbuff, 10000, stdin) != NULL)
  {
    fprintf (stderr, "bien recu %s\n", inbuff);
    fprintf (stdout, "bien recu %s\n", inbuff);
  }
  return 0;
}
le programme qui crée les pipes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
static int aleatoire (int maximum)
{
    double d;
    d = (double) maximum * rand();
    d = d / (RAND_MAX + 1.0);
    return ((int) d);
}
 
int main (int argc, char * argv[])
{
    int tube_1[2];
    int tube_2[2];
    if ((pipe(tube_1) != 0) || (pipe(tube_2) != 0))
      return -1;
    switch (fork()) {
      case -1 :
       close(tube_1[0]); close(tube_1[1]);
        close(tube_2[0]); close(tube_2[1]);
      return -1;
      case 0 : 
        close(tube_1[1]);
        close(tube_2[0]);
        dup2(tube_1[0], STDIN_FILENO);
        close(tube_1[0]);
        dup2(tube_2[1], STDOUT_FILENO);
        close(tube_2[1]);
        execv ("readStd", NULL);
        exit(EXIT_SUCCESS);
      default :
        close(tube_1[0]);
        close(tube_2[1]);
 
        char trameIP[256] = "";
 
        while(1) 
        {
          int attente = 1000000*aleatoire(5);
          sprintf (trameIP, "trame à envoyé %d\n", attente);
          fprintf (stderr, "trame à envoyé %d\n", attente);
 
          write(tube_1[1], trameIP, strlen(trameIP)+1);
          usleep(attente);
        }
    }
   return 0;
}
j'arrive a recoir le premier message mais pas les suivants et je comprends pas ce que je fait de mal
si quelqu'un a une piste merci

edit:
je précise que les stderr sont la uniquement pour avoir une sortie et que je ne gère pas les stdout pour le moment j'attends de gérer les stdin d'abords correctement