Bonjour à tous.
Je ne sais pas si vous pourrez m'aider cette fois mais voici mon probléme:
En fait je dois coder un minishell et afin que dans ce minishell on puisse execute plus de 2 commandes, je dois utiliser des tubes, on m'a donner l'algorithme du code mais le probléme c'est que quand je lance une commande comme : "ls -1 | wc -l" ca me donner un resultat correct mais ca quitte mon minishell
Voici l'algo:
Il s’agit d’itérer n-1 fois le traitement suivant :
* créer un tube qui va relier la commande i à la commande i+1
* créer un fils qui
o duplique son descripteur d’accès en écriture sur le tube vers sa sortie standard,
o exécute la commande commandi et termine ;
* le père redirige son descripteur en lecture sur le tube vers son entrée standard et continue.
puis de créer un dernier fils pour exécuter la commande commandn.
Le code :
Voici ce que ca m'affiche :Code:/* ------------------------------ $Id: pipe.c,v 1.2 2005/03/29 09:46:52 marquet Exp $ ------------------------------------------------------------ mshell - a job manager */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> #include<sys/wait.h> #include "cmd.h" #include "sighandlers.h" #include "jobs.h" #include "pipe.h" #include "common.h" #include "makeargv.h" void do_pipe(char *cmds[MAXCMDS][MAXARGS], int nbcmd, int bg) { int fd[2]; pid_t pid1; pid_t pid2; int i ; int status; /* printf("Resultat : ");*/ pipe(fd); for (i =0; i<nbcmd-1;i++) { pipe(fd); pid1= fork(); if (pid1==-1) { printf(" erreur lors de la création du tube \n"); return; } else if (pid1==0) { close(fd[0]); dup2(fd[1],STDOUT_FILENO); execvp(*cmds[i], cmds[i]); /* exit(0);*/ } else { close(fd[1]); dup2(fd[0],STDIN_FILENO); } } pid2=fork(); if (pid2==-1) { printf(" erreur lors de la création du tube \n"); return; } else if (pid2==0) { close(fd[0]); dup2(fd[1],STDOUT_FILENO); execvp(*cmds[nbcmd-1], cmds[nbcmd-1]); /* exit(0);*/ } else { close(fd[0]); close(fd[1]); wait(&status); wait(&status); } /* printf("la valeur est %s", *cmds[1]);*/ return; }
Pourtant mon qui qui ne permet d'executer que 2 commandes marche nickelCode:mshell> ls -1 | wc -l 32 mshell> ZOZO@a10p19:~/TPC/TP6/mshell$
Code:/* ------------------------------ $Id: pipe.c,v 1.2 2005/03/29 09:46:52 marquet Exp $ ------------------------------------------------------------ mshell - a job manager */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> #include<sys/wait.h> #include "cmd.h" #include "sighandlers.h" #include "jobs.h" #include "pipe.h" #include "common.h" #include "makeargv.h" void do_pipe(char *cmds[MAXCMDS][MAXARGS], int nbcmd, int bg) { int fd[2]; pid_t pid1; pid_t pid2; int status; pipe(fd); pid1= fork(); if (pid1==-1) { printf(" erreur lors de la création du tube \n"); return; } else if (pid1==0) { printf(" ENTREE DANS LE FILS"); close(fd[0]); dup2(fd[1],STDOUT_FILENO); execvp(*cmds[0], cmds[0]); exit(0); } pid2= fork(); if (pid2==-1) { printf(" erreur lors de la création du tube \n"); return; } else if (pid2==0) { close(fd[1]); dup2(fd[0],STDIN_FILENO); execvp(*cmds[1], cmds[1]); exit(0); } close(fd[0]); close(fd[1]); wait(&status); wait(&status); /* printf("la valeur est %s", *cmds[1]);*/ return; }
Je ne suis pas le seul a avoir ce problème c'est peut-etre l'algo qui nous enduit en érreur.
Avez vous une idée sur comment résoudre ce probléme?
-----