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

POSIX C Discussion :

File de messages


Sujet :

POSIX C

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut File de messages
    Bonjour,
    j'ai besoin d'échanger entre deux processus (1 writer, 1 reader), je teste les files de messages.
    Le code du writer:
    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
     
    struct Msgbuf {
        long mtype;       /* message type, must be > 0 */
        char mtext[128];    /* message data */
    };
     
    int main()
    {
        int msgq;   //message queue identifier
        key_t cle;
     
        cle = ftok(PATH, PROJ_ID);
        if(cle < 0) {
            perror("ftok");
            exit(EXIT_FAILURE);
        }
     
        msgq = msgget(cle, 0660 | IPC_CREAT);
        if(msgq < 0) {
            perror("msgget");
            exit(EXIT_FAILURE);
        }
     
        struct Msgbuf msgbuf;
        msgbuf.mtype = 1;
     
        strcpy(msgbuf.mtext, "Hello");
        msgsnd(msgq, &msgbuf, sizeof(struct Msgbuf), 0);
        printf("Sent %s\n", msgbuf.mtext);
        usleep(1000000);
     
        msgbuf.mtype = 2;
        strcpy(msgbuf.mtext, "You !!!");
        msgsnd(msgq, &msgbuf, sizeof(struct Msgbuf), 0);
        printf("Sent %s\n", msgbuf.mtext);
     
        printf("Enter key to continue: ");
        getchar();
        msgctl(msgq, IPC_RMID, NULL);
        exit(EXIT_SUCCESS);
    }
    Le code du reader:
    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
     
    struct Msgbuf {
        long mtype;       /* message type, must be > 0 */
        char mtext[128];    /* message data */
    };
     
    int main()
    {
        int msgq;   //message queue identifier
        key_t cle;
        struct Msgbuf msgbuf;
        int nb_octets;
     
        cle = ftok(PATH, PROJ_ID);
        if(cle < 0) {
            perror("ftok");
            exit(EXIT_FAILURE);
        }
     
        msgq = msgget(cle, 0660 | IPC_CREAT);
        if(msgq < 0) {
            perror("msgget");
            exit(EXIT_FAILURE);
        }
     
        printf("Waiting for message...\n");
        do {
            nb_octets = 0;
            nb_octets = msgrcv(msgq, &msgbuf, sizeof(struct Msgbuf), 0, MSG_NOERROR);
            printf("%d %s\n", nb_octets, msgbuf.mtext);
            if(nb_octets < 0) {
                perror("msgrcv");
                break;
            }
        }while(msgbuf.mtype > 0);
     
        printf("Fin du lecteur.\n");
        exit(EXIT_SUCCESS);
    }
    Côté reader, 136 "Hello" est affiché puis plus rien jusqu'à ce que côté writer on appuie sur une touche du clavier.
    Le reader répond par -1 "Hello" encore une fois. Apparemment "You !!!" n'arrive jamais puis "msgrcv: Identifier removed" puisque le reader clôt la file.
    Que manque t-il à mon code?
    Merci pour votre aide...

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par rdtech Voir le message
    Que manque t-il à mon code?
    La taille passée en second paramètre de msgsnd() ne doit pas inclure celle de "mtype". En demandant à envoyer plus d'octets que nécessaire, la fonction va chercher plus d'octets et dépasse la zone réservée à Msgbuf => comportement indéterminé.
    Remplace msgsnd(msgq, &msgbuf, sizeof(struct Msgbuf), 0) par msgsnd(msgq, &msgbuf, sizeof(msgbuf.mtext), 0). Mis à part ce détail, chez-moi ton code fonctionne (il fonctionne aussi tel que tu l'as écrit à l'origine mais justement c'est ça un comportement indéterminé => parfois ça marche).
    Pour msgrcv() c'est moins grave car la fonction récupère "au plus" la taille demandée donc s'il y a moins que demandé c'est pas grave. Mais bon si tu peux faire les choses bien ici aussi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour Sve@r et merci.
    C'était bien l'erreur et ça fonctionne maintenant.
    Mais il me reste une interrogation:
    côté msgrcv(), la page de man dit: "Si msgtyp est supérieur à 0, alors le premier message de type msgtyp est extrait de la file". msgsnd ne transmet pas le type du message, comment peut elle extraire le message correspondant dans la file?

    Si tu as une réponse, je suis intéressé.
    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rdtech Voir le message
    Mais il me reste une interrogation:
    côté msgrcv(), la page de man dit: "Si msgtyp est supérieur à 0, alors le premier message de type msgtyp est extrait de la file". msgsnd ne transmet pas le type du message, comment peut elle extraire le message correspondant dans la file?
    La partie rouge de ta phrase est incorrecte. msgsnd() reçoit en paramètre un pointeur de type msgbuf donc elle a accès à tout msgbuf. Il n'y a aucune raison qu'elle n'envoie pas mtype à la msq.
    Ce n'est pas parce que dans la taille tu ne prends pas en compte la taille "mtype" que cette info n'est pas intégrée automatiquement par msgsnd()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Ok, good !! C'est clair maintenant.
    C'est le sizeof() dans msgsnd() qui m'a induis en erreur.
    Merci Sve@r pour tes explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/05/2006, 15h41
  2. [Debutant]Probleme file de message
    Par Treuze dans le forum C
    Réponses: 11
    Dernier message: 15/05/2006, 21h46
  3. Créer plusieures file de message différentes
    Par progamer54 dans le forum Linux
    Réponses: 6
    Dernier message: 06/04/2006, 15h36
  4. Réponses: 8
    Dernier message: 09/02/2006, 18h51
  5. IPC : Files de messages et accès exclusif
    Par thomasvst dans le forum C
    Réponses: 2
    Dernier message: 07/12/2005, 09h47

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