Probleme qur un programme C type shell : fork, exec, dup2, pipe.
simon357
Messages postés
13
Statut
Membre
-
Dalfab Messages postés 720 Statut Membre -
Dalfab Messages postés 720 Statut Membre -
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 :
Merci beaucoup à ceux qui voudront bien m'aider, je leur serai très reconnaissant :) !
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.
- Classic shell - Télécharger - Personnalisation
- Programme demarrage windows - Guide
- Mettre en veille un programme - Guide
- Clear type - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide