Enchaîner une série de commandes avec des pipes

Enai Messages postés 1 Date d'inscription samedi 27 décembre 2008 Statut Membre Dernière intervention 15 mai 2009 - 27 déc. 2008 à 11:08
ZMJUVENTINO Messages postés 41 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 11 mai 2009 - 15 mars 2009 à 14:20
Bonjour, j'ai un projet qui consiste à créer un mini Shell, je dois donc créer une succession de pipe en fonction du nombre de commande que j'entre. Pour le moment j'arrive à lancer 3 commandes successives mais à la 4° il me marque une erreur : "sortie standard: mauvais descripteur de fichier"
j'ai cherché toute la journée d'hier, essayant une multitude de choses différentes, au début j'avais essayé avec un seul pipe, et jme suis rendu compte qu'il fallait mieux un tableau de pipe !

J'ai une structure pour mes commandes :
Command{
     char* command;
     char** argv;
     int nbarg;
     int back;
     ...
     struct Command *next;
     }Command;


void exec(Command* cmd){
   
        int nbCom=nbCommand(cmd);//récupère le nombre de commandes
        int tube[nbCom-1][2];
        int boolean=0;
        pid_t pid;
        int nbPipe=-1;//j'initialise l'indice du tableau de pipes à -1
        int i;
        switch(fork()){
            case-1: printf("fork failed");break;
            case 0 : /*fils*/
            
                for(i=0; i<nbCom; i++){    
                    if(pipe(tube[i])==-1){//créé le nombre de pipes nécessaires
                        printf("pipe failed");
                    }
                }
                
                while(cmd!=NULL){
                
                    
                
                switch(pid=fork()){
                        case -1: printf("fork failed");break;
                        case 0 : /*fils*/
                            if(boolean==1){/*modification de l'entrée*/
                                /*if(i>0){
                                    close(tube[nbPipe-1][0]);
                                    close(tube[nbPipe-1][1]);
                                }*/
                                close(tube[nbPipe][1]);
                                fclose(stdin);
                                dup2(tube[nbPipe][0], 0);
                            }else close(tube[nbPipe][0]);

                            if(cmd->next!=NULL){/*modification de la sortie*/
                                close(tube[nbPipe+1][0]);
                                fclose(stdout);
                                dup2(tube[nbPipe+1][1], 1);
                            }else close(tube[nbPipe+1][1]);
                            
                            execv(cmd->command, cmd->argv);break;
                        default : /*père*/
                            
                            close(tube[nbPipe][0]);
                            close(tube[nbPipe][1]);
                            
                            
                            break;
                    }
                    
                    boolean=1;
                    cmd=cmd->next;//je passe à la commande suivante
                    nbPipe++;//j'incrémente l'indice du tableau de pipes
                }    
                for(i=0; i<nbCom; i++){
                    wait();
                }
                break;
            default : /*père*/
                

                break;
        }
        if(!isBack(cmd)){
            while(waitpid(0, 0, 0)<0);
        }
        
    
    
}

1 réponse

ZMJUVENTINO Messages postés 41 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 11 mai 2009
15 mars 2009 à 14:20
Moi aussi j'ai le même problème est-ce que quelqu'un en a une solution ?

foza juve
0
Rejoignez-nous