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

Linux Discussion :

Aide pour les Tubes de Communication sous Linux (Pipes) !


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 41
    Points
    41
    Par défaut Aide pour les Tubes de Communication sous Linux (Pipes) !
    Bonjour, à nouveau je dois me résoudre à faire appel à vos connaissances!

    Voici mon problème:

    J'ai créer un processus Père qui va créer des Fils à l'aide de la fonction fork().
    Jusqu'ici pas de problèmes.
    Ensuite, j'ai remplacer le fils par un programme à l'aide de la fonction execlp().
    Voici le code en question:
    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
        Trace("Controle: Lancement de Robot");
        if ((idRobot = fork()) == -1)
        {
            perror("Controle: Erreur de creation de Chemin");
            Sortie(1);
        }
     
        if (!idRobot)
        {
            /* processus fils */
            sprintf(szBuffer, "%d", dpipe[1]);
            sprintf(szQueue, "%d", dpipe[0]);
            execlp("./Robot","./Robot","5",szQueue, szBuffer, NULL);
            perror("Controle: Erreur de execl du programme Robot");
        }
    Note la fonction Trace peut être considérée comme un simple printf();

    Mon gros problème est que je souhaite créer un pipe entre plusieurs processus fils!
    Pour créer le pipe, c'est simple à l'aide de la fonction pipe(int descripteurs[2])

    Alors si j'ai bien compris le système, je crée mon pipe dans le processus père, mais maintenant, je ne sais pas comment y accéder depuis le fils ! Je suis perdu pour ça. Je n'arrive pas à comprendre comment envoyer les descripteurs aux fils. J'ai déjà essayé pauvrement en ajoutant des arguments au processus fils... Mais ça n'a pas l'air de marcher très fort.

    Bref, j'espère que je me suis bien fait comprendre.

    Mon problème est que je ne sais pas comment récupérer le pipe dans mes processus fils ! Et donc, je ne sais rien faire avec...

    Merci déjà de votre aide précieuse

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Les pipes et les forks sont toujours un peu pointilleux... Alors vouloir faire parler deux fils ensemble...

    Je dois partir donc les explications se trouvent dans le code ci-dessous (je n'ai pas non plus fait tous les test, on devrait tester le retour du fork mais plus le temps...) :

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/wait.h>
     
    int main()
    {
        int p[2];
        char buf[128];
     
        if(pipe(p) == -1) {
            fprintf(stderr, "Erreur avec pipe\n");
            return EXIT_FAILURE;
        }
     
        printf("Pere cree deux processus fils qui vont se parler\n");
     
        if(fork()) {
            printf("Pere va cree le 2eme processus\n");
     
            if(fork()) {
                printf("Pere va attendre les deux fils\n");
     
                /* Pere peut fermer le pipe, il ne s'en sert pas */
                close(p[0]);
                close(p[1]);
     
                wait(NULL);
                wait(NULL);
     
                printf("Pere a termine\n");
            }
            else {
                printf("Deuxieme fils va recevoir un message par le pipe\n");
     
                /* 2eme fils: Ferme le pipe d'ecriture et l'entree standard */
                close(0);
                close(p[1]);
     
                /* dup(p[0]) permet maintenant d'avoir l'entree du pipe comme entree standard */
                dup(p[0]);
                /* 2eme fils: on ferme p[0], il est maintenant en double... */
                close(p[0]);
     
                /* Lecture */
                if(fgets(buf, sizeof(buf), stdin) != NULL) {
                    printf("2eme fils : %s\n",buf);
                }
                else {
                    printf("Erreur avec fgets\n");
                }
     
                /* On ferme le pipe */
                close(0);
     
                printf("2eme fils termine\n");
            }
        }
        else {
            int sortie;
     
            printf("Premier fils va ecrire un message par le pipe\n");
     
            /* 1er fils: Ferme le pipe d'ecriture et l'entree standard */
            sortie = dup(1);
            close(1);
            close(p[0]);
     
            /* dup(p[0]) permet maintenant d'avoir l'entree du pipe comme entree standard */
            dup(p[1]);
            /* 2eme fils: on ferme p[0], il est maintenant en double... */
            close(p[1]);
     
            printf("Bonjour, c'est genial!!!\n");
     
            /* On remet la sortie standard et on ferme le pipe */
            close(1);
            dup(sortie);
            close(sortie);
     
            printf("1er fils termine\n");
        }
     
        return EXIT_SUCCESS;
    }

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 41
    Points
    41
    Par défaut
    merci bien pour la réponse, mais en fait, je n'arrive toujours pas à tout comprendre...

    Là, les deux forks ils dupliquent le père et s'attribuent des PID différents... Mais dans mon cas, les fils sont un programme différent du père... Enfin, je ne sais pas si vous me comprennez, j'utilise la fonction execlp(...).

    Et en fait, l'endroit où je m'embrouille vraiiment c'est... comment récupérer et pouvoir utiliser les pipes dans ces processus...

    Je ne vous mets pas le code en entier, ce serait bcp trop long. Mais il faut savoir que les deux processus ont des main différents...

    Faut-il utiliser un tube nommé dans ce cas?

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 41
    Points
    41
    Par défaut
    Je me reréponds car j'ai été bouquinner pas mal, évidemment, je ne vois toujours pas comment faire exactement, mais il y a quelques petits détails qui sont plus clair dans ma tête.

    lors d'un fork(), le système dupplique la partie données, tables descripteurs etc, sauf le code qui reste partagé avec le père et le fils.

    Maintenant, lorsque je fais mon execlp(blabla), celui-ci me remplace mon processus par celui passé en paramètres... (suivant le man).

    Mais, il y a toujours un petit quelque chose qui m'échape... après le execlp, est-ce que mes processus partagent toujours la zone données et la table des descripteurs de fichiers? Et si oui, comment est-ce que je peux récupérer mes descripteurs de pipe...

    Ouf, je crois que suis en train de tomber dans le gouffre du plus-rien-comprendage et plus je m'acharnes dessus et plus je ne sais pas comment il faut faire...

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par dridri
    Mais, il y a toujours un petit quelque chose qui m'échape... après le execlp, est-ce que mes processus partagent toujours la zone données et la table des descripteurs de fichiers? Et si oui, comment est-ce que je peux récupérer mes descripteurs de pipe...

    ben passes tes descripteurs de fichiers en arguments "sur la ligne de commande lancée" dans le execlp... et ça marchera
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 41
    Points
    41
    Par défaut
    rho, c'est ce que j'avais fais mais j'avais un problème, du coup je pensais que les processus avaient des différentes tables de descripteur....

    merci beaucoup, ça doit être une erreur sur un read bloquant ou qq chose du genre alors

    EDIT: voilà, le problème était que je n'avais pas mis de close() dans le père et donc le read était bloquant... ralalala, remerci beaucoup

Discussions similaires

  1. [MCD sous Visio 2003] Aide pour les relations
    Par lerieure dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/06/2011, 15h23
  2. [Conception] Aide pour les liaison entre 2 table
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/09/2006, 13h03
  3. Besoin d'aide pour les dates
    Par Aurore_atmo dans le forum MATLAB
    Réponses: 6
    Dernier message: 03/07/2006, 15h37
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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