Communication par tube
Répondre à la discussion
Affichage des résultats 1 à 1 sur 1

Communication par tube



  1. #1
    SEIYA00

    Communication par tube


    ------

    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?

    -----
    Dernière modification par SEIYA00 ; 23/03/2012 à 18h30.

Discussions similaires

  1. Communication de données par USB
    Par nico57600 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 10/02/2010, 17h37
  2. communication par rs232
    Par the_lightner dans le forum Électronique
    Réponses: 14
    Dernier message: 18/07/2007, 10h24
  3. communication par satellite
    Par invitebb36e395 dans le forum Technologies
    Réponses: 1
    Dernier message: 18/04/2006, 12h05
  4. Communication par intrication
    Par Penangol dans le forum Physique
    Réponses: 7
    Dernier message: 25/03/2006, 09h10
  5. Tpe communication par pheromones
    Par invite210192ab dans le forum TPE / TIPE et autres travaux
    Réponses: 25
    Dernier message: 13/12/2004, 08h27