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 :
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;
}
Voici ce que ca m'affiche :
Code:
mshell> ls -1 | wc -l
32
mshell> ZOZO@a10p19:~/TPC/TP6/mshell$
Pourtant mon qui qui ne permet d'executer que 2 commandes marche nickel
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?