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:
Probleme qur un programme C type shell : fork, exec, dup2, pipe.
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.