IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

A l'aide: Problème Multi-Pipe


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut A l'aide: Problème Multi-Pipe
    Bonjour à tous!!
    Je sollicite grandement votre aide sur un problème sur lequel je ne parviens vraiment pas à trouver de solutions. Cela fait maintenant 3 jours, et je ne comprends pas ce qui cloche.
    Je dois simuler l'execution des pipes avec n commandes (cmd1 | cmd2 | .. | cmdn)
    Je crois avoir tout essayé.
    J'essaye d'abord de simuler l'éxecution de ls | more | wc
    J'ai compris les grandes étapes:
    1.Je crée un tableau de 2 pipe
    2.Je fork 3 fois
    3.Pour chaque processus, je redirige correctement (enfin je pense) mon entrée et sortie standard

    Mais voila, le programme bloque, à l'execution du more. Pouvez-vous m'expliquer ce qu'il ne va pas?

    D'avance merci pour votre aide

    Voici le code de ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    void executePipe(char * commande[]) {
        //int nbPipe = nbCaracteresSpeciaux(commande);
        int ** tabPipe = malloc(2 * sizeof (int*));
        int i = 0;
        for (i = 0; i < 2; i++) {
            tabPipe[i] = (int*) malloc(2 * sizeof (int));
            pipe(tabPipe[i]);
        }
     
        //char * tabComSansPipe1[2 + 1];
        //comSansPipe(commande, tabComSansPipe1);
        //char * tabComSansPipe[] = {tabComSansPipe1[0], tabComSansPipe1[1], (char*)NULL};
        char * tabComSansPipe[] = {"ls", "more", "wc", NULL};
        int cptCom = 0; //Compteur de commande
        int cptPipe = 0; //Compteur de pipe
        //int nbCom = nbElementsCommande(tabComSansPipe);
        switch (fork()) {
            case -1:
                perror("Erreur fork");
                break;
            case 0:
                for (cptCom = 0; cptCom < 3; cptCom++) {
                    printf("On passe la %d\n", cptPipe);
                    switch (fork()) {
                        case -1:
                            printf("Erreur Fork\n");
                            break;
                        case 0:
                            if (cptCom == 0) {//La commande est au début
                                //On utilise le 1er Pipe sur lequel on va écrire
                                fprintf(stdout, "%s\n", tabComSansPipe[cptCom]);
                                close(tabPipe[cptPipe][0]);
                                dup2(tabPipe[cptPipe][1], 1);
                                close(tabPipe[cptPipe][1]);
                                execlp(tabComSansPipe[cptCom], tabComSansPipe[cptCom], (char*) NULL);
     
                            } else if (cptCom > 0 && tabComSansPipe[cptCom + 1] != NULL) {//On est au milieu
                                //On doit lire sur le pipe-1 et ecrire sur le prochain pipe
                                fprintf(stdout, "%s\n", tabComSansPipe[cptCom]);
                                close(tabPipe[cptPipe - 1][1]);
                                dup2(tabPipe[cptPipe - 1][0], 0);
                                close(tabPipe[cptPipe - 1][0]);
                                close(tabPipe[cptPipe][0]);
                                dup2(tabPipe[cptPipe][1], 1);
                                close(tabPipe[cptPipe][1]);
                            } else if (tabComSansPipe[cptCom + 1] == NULL) {//On est à la fin
                                fprintf(stdout, "%s\n", tabComSansPipe[cptCom]);
                                close(tabPipe[cptPipe - 1][1]);
                                dup2(tabPipe[cptPipe - 1][0], 0);
                                close(tabPipe[cptPipe - 1][0]);
                            }
                            fprintf(stdout, "On va executer %s\n", tabComSansPipe[cptCom]);
                            execlp(tabComSansPipe[cptCom], tabComSansPipe[cptCom], (char*) NULL);
                            exit(0);
                            break;
                        default:
                            wait(NULL);
                            cptPipe++;
                    }
                }
                exit(0);
                break;
            default:
                wait(NULL);
                printf("FIINNN\n");
        }
        free(tabPipe);
    }

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Salut

    As-tu déjà essayé de faire une commande simple du style "ls | wc" juste pour voir ce que ça donne ?
    J'ai l'impression que tu fais un peu trop de "close" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    close(tabPipe[cptPipe - 1][1]);   // tu ferme la sortie du "pipe - 1"
    dup2(tabPipe[cptPipe - 1][0], 0);  // tu remplace l'entrée standard par l'entrée du "pipe - 1"
    close(tabPipe[cptPipe - 1][0]);  // et là tu fermes l'entrée du "pipe - 1"
    close(tabPipe[cptPipe][0]);  // tu fermes l'entrée standard du pipe actuel
    dup2(tabPipe[cptPipe][1], 1);  // tu remplaces la sortie standard par la sortie du pipe
    close(tabPipe[cptPipe][1]);  // tu fermes la sortie du pipe actuel
    Puis tu exécutes ta commande "ls" disons, mais l'entrée et sortie du pipe sont toutes fermées au moment de l'exécution : la commande "more" ne reçoit rien ^^
    Essaie d'enlever les "close" qui sont en rouge
    En espérant t'avoir aidé

Discussions similaires

  1. Problème avec multi-pipes
    Par Shuny dans le forum C
    Réponses: 4
    Dernier message: 07/05/2010, 11h16
  2. Aide sur Multi-Threading
    Par Fred2209 dans le forum Windows
    Réponses: 7
    Dernier message: 18/04/2007, 17h26
  3. Aide Probléme Connxion ADSL
    Par amazircool dans le forum Dépannage et Assistance
    Réponses: 4
    Dernier message: 19/03/2006, 23h09
  4. Aide: Problème avec la taille de mon fichier
    Par ATTIA dans le forum Langage
    Réponses: 6
    Dernier message: 15/03/2006, 10h19
  5. de l'aide, problème avec lecteur CD/graveur
    Par princetn dans le forum Périphériques
    Réponses: 2
    Dernier message: 18/02/2006, 06h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo