Probleme qur un programme C type shell : fork, exec, dup2, pipe.

Fermé
simon357 Messages postés 8 Date d'inscription mercredi 21 janvier 2009 Statut Membre Dernière intervention 11 février 2016 - Modifié par simon357 le 11/02/2016 à 21:36
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 12 févr. 2016 à 00:09
Bonjour tout le monde,

Je travaille sur un petit programme en C. Il s'agit d'un shell linux qui doit pouvoir exécuter des commandes présents dans $PATH. Les commandes type "ls -l" ou "pwd" marche très bien.
Actuellement j'aimerais implémenté dans mon programme le Pipe afin de pouvoir saisir des commandes tels "ls -l | wc -l".
J'ai donc utiliser 2 fork (un par commande) + exec ainsi que la fonction dup2 afin de redirigé la sortie standard de ls -l et l'entrée standard de wc -l.
Cependant, mon code ne marche pas, ou du moins, il buggue sevère.
Certaines commandes marchent à peu près bien mais mon affichage du terminal devient complémentement buggué après.
Je pense que mon implémentation du pipe n'est pas bonne pas dans mon code mais je vois vraiment pas ou !
Par exemple, la commande "ls -l | wc -l" (qui est censé afficher le nombre de fichier présent dans mon répertoire courant) ne marche pas du tout.

Voici une capture de mon terminal :


Voici la partie de mon de code qui pose problème :
} else { 
int res_pipe = pipe(tube);

pid_t first_fork = fork();
if (first_fork==0){
int dup_ret = dup2(tube[1], 1);
int ret = execvp(params_cmd1[0], params_cmd1);
// params_cmd1[0] = nom de la cmd 1 (exemple : "ls")
// params_cmd1 = tableau des paramètres (exemple : { "ls", "-l", NULL} )
return ret;
} else {

int statut_first_child;
waitpid(first_fork, &statut_first_child, WNOHANG );
//On attend que le fils se termine
pid_t second_fork = fork();

if (second_fork== 0) {
int dup_ret = dup2(tube[0], 0);
printf("\n");
int ret = execvp(params_cmd2[0], params_cmd2);
// params_cmd2[0] = nom de la cmd 2 (exemple : "wc")
// params_cmd2 = tableau des paramètres (exemple : { "wc", "-l", NULL} )
return ret;
} else {
int statut_second_child;
waitpid(second_fork, &statut_second_child, WNOHANG );
//On attend que le fils se termine
printf("\nshell3:::cmd>");
fgets(cmd_global, sizeof cmd_global, stdin);
swap_retour_chariot(cmd_global); // converti '\n' en '\0'
strncpy(exit_user, cmd_global, 5);
exit_user[4] = '\0';
}
}
}



Merci beaucoup à ceux qui voudront bien m'aider, je leur serai très reconnaissant :) !
A voir également:

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
12 févr. 2016 à 00:09
Bonjour,

Je pense que les 2 fils devraient faire un close sur le côté du pipe qu'ils n'utilisent pas, sinon les transferts risquent de se faire vers le mauvais interlocuteur.
Et peut-être que le dup2 nécessite d'être restauré vers stdin et stdout avant l'arrêt des 2 fils.

Dalfab
0