Bonjour à tous et à toutes,

Je suis en train de réaliser un interpréteur de commandes shell, et je bute sur l'exécution des pipes (ici une commande simple "ls | wc").

En effet, je souhaite réaliser ceci dans une fonction récursive, mais le programme s'arrête et continue à lire sur l'entrée standard après une seule itération (après l'exécution de wc dans le fils)...

Voici mon code :

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
void            test_recurs(pid_t pid, char **ae)
{
  char  *const  arg[2] = {"/bin/ls", NULL};
  char  *const  arg2[3] = {"/bin/wc", NULL};
  static int    limit = 0;
  int           check;
  int           fd[2];
 
  if (limit > 5)
    return ;
  if (pipe(fd) == -1)
    {
      printf("pipe failed\n");
      return ;
    }
  pid = fork();
  if(pid != 0)
    {
      printf("père %d\n",getpid());
      close(fd[0]);
      dup2(fd[1], 1);
      close(fd[1]);
      if ((execve("/bin/ls", arg, ae)) == -1)
        exit(125);
      dprintf(2, "execution ls\n");
      wait(&check);
    }
  else
    {
      printf("fils %d\n", getpid());
      close(fd[1]);
      dup2(fd[0], 0);
      close(fd[0]);
      if ((execve("/bin/wc", arg2, ae)) == -1)
        printf("echec execve\n");;
      dprintf(2, "limit[%d]\n", limit); /* ça bloque juste avant ce dprintf */
      limit++;
      test_recurs(pid, ae);
    }
}
Merci pour votre aide !