begin process at 2012 05 28 20:56:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Système

 > 

Autre

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

samedi 27 décembre 2008 à 11:08:26 | Enchaîner une série de commandes avec des pipes

Enai

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 :
[code]Command{
     char* command;
     char** argv;
     int nbarg;
     int back;
     ...
     struct Command *next;
     }Command;[/code]




[code]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);
        }
       
   
   
}[/code]

dimanche 15 mars 2009 à 14:20:01 | Re : Enchaîner une série de commandes avec des pipes

ZMJUVENTINO

Moi aussi j'ai le même problème est-ce que quelqu'un en a une solution ?

foza juve


Cette discussion est classée dans : int, cmd, close, tube, nbpipe


Répondre à ce message

Sujets en rapport avec ce message

Cgui class (for(int i=0) [ par frayst ] Bonjour,Je suis entraint de coder un gui pour un jeu ...J'ai cree un vector pour pouvoir creer mes fenetre simplement et pouvoir les draw...J'ai ajout rien ne s'affiche a l'execution(les tubes ordinaires) [ par brekiano ] bonsoir,  svp chui débutant dans la programmation systeme sous unix.j'ai fait ce programme qui affiche normalement le résultats de ce pipes :    ]$ ps Communication entre pere et fils [ par anek971 ] Bonjour, Je dois actuellement codé un petit programma a priori simple sous linux. Il s'agit de faire un programme client serveur avec le client qui e Explication de ce programme [ par bounkolh ] Bonjour est ce que quelqu'un peut m'expliquer le déroulement de ce programme svp? #include #include int main(int argc, char *argv[ ]) { int tube[2 Explication et correction de ce programme [ par bounkolh ] Bonjour, est ce que quelqu'un peut m'aider à expliquer et corriger ce programme svp? #include #include int main(int argc, char *argv[]) { int mon pointeur de char [ par hacker_mt ] Salut tout le monde voici mon code :#include #include void rajout(char ip[15], char *cmd){         int i, j;         for(i=0;i                         Affecter l'équivalent hexa d'un int décimal dans un char [ par kididouille ] Bonjour, je bloque:J'ai une fonction où je recois une date format UTC YYMMDD on m'envoie un int par exemple 080829 (la date d'aujourd'hui)je dois fair Argument - argv etc.. [ par oshin ] Bonjour,J'ai créer un petit programme mais j'ai un probleme :#include #include #include char ident[600];int main(int argc, char *argv[]) {<b


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales