Problème dup2 / pipe / close
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:
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 !