OVH Cloud OVH Cloud

probleme avec la fermeture d'un descripteur

1 réponse
Avatar
did
salut
j'ai tente d'ecrire une fonction recursive qui execute des commandes
jointes avec plusieurs pipe. En l'occurence, ici, j'ai essaye avec deux
pipe la combinaison ls | uniq | wc
Mais le programme bloque lorsque je fais un close(1).
Bon, je suis conscient que cette fonction ne marchera pas autrement
qu'avec 3 commandes. C'est juste un essai, mais ca fait quelques jours
que j'essai d'arranger cette fonction pour qu'elle m'execute autant de
pipe que je veux, mais sans resultat. Je commence a desesperer. :'(
Si quelqu'un veut me donner un coup de main, c'est volontier :)
bonne soiree

...
listecom[0] = "ls" ;
listecom[1] = NULL ;
listecom[2] = "uniq" ;
listecom[3] = "NULL" ;
listecom[4] = "wc" ;
listecom[5] = NULL ;

int main(void) {
if (pipe(tubes1) == -1) {
perror("pipe") ;
exit (EXIT_FAILURE) ;
}
if (pipe(tubes2) == -1) {
perror("pipe") ;
exit (EXIT_FAILURE) ;
}
executer_fork(3, listecom, 4, 4, tubes1, tubes2) ;
}

void executer_fork(int nb_fork, char** listecom, int i, int nb, int*
tubes1, int* tubes2) {

if (nb_fork > 0) {
int res ;
executer_fork(nb_fork - 1, listecom, i - 2, nb, tubes1, tubes2) ;

res = fork() ;
if (res == -1) {
perror("fork") ;
exit (EXIT_FAILURE) ;
}

if (res == 0) {

/* derniere commande */
if (nb == i) {

close(0) ;
dup(tubes1[0]) ;
close(tubes1[0]) ;
close(tubes1[1]) ;

execvp(listecom[i], &listecom[i]) ;
perror("execvp") ;
exit (EXIT_FAILURE) ;
}
/* premiere commande */
else if (i == 0) {

close(1) ;
dup(tubes2[1]) ;
close(tubes2[0]) ;
close(tubes2[1]) ;

execvp(listecom[i], &listecom[i]) ;
perror(NULL) ;
exit (EXIT_FAILURE) ;
}
else if (i > 0 && i < nb) {

close(0) ;

dup(tubes2[0]) ;

close(tubes2[0]) ;
close(tubes2[1]) ;

close(1) ; /* ca coince ici */

dup(tubes1[1]) ;
close(tubes1[1]) ;
close(tubes1[0]) ;

execvp(listecom[i], &listecom[i]) ;
perror("execvp") ;
exit (EXIT_FAILURE) ;
}
}

if (res > 0) {
wait(NULL) ;
}
}

}

1 réponse

Avatar
Laurent Wacrenier
did écrit:
salut
j'ai tente d'ecrire une fonction recursive qui execute des commandes
jointes avec plusieurs pipe. En l'occurence, ici, j'ai essaye avec deux
pipe la combinaison ls | uniq | wc
Mais le programme bloque lorsque je fais un close(1).


uniq dans ce cas doit avoir son entrée et sa sortie ouverte. Des
données viennent et vont aléaoirement dans l'entrée et la sortie.
Pour savoir quand il y a quelque chose à lire ou à écire, utilise
select ou poll.