File de message en C aidez moi SVP

Résolu/Fermé
paladice - 3 mai 2011 à 22:37
 paladice - 5 mai 2011 à 00:59
bonjour à tous,

je suis un débutant en C et j'essaie de comprendre les IPC en ce moment.
Ma question concerne les files de message.
J'ai cru comprendre que le type d'un message c'est un peu comme un indice pour le retrouver dans la file.
J'ai donc implémenté ce code pour tester :

#include <stdio.h>

#include <stdlib.h>

#include <string.h> 

#include <time.h>

#include <sys/msg.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/wait.h>

#include <netinet/in.h>

#include <libgen.h>

#include <sys/socket.h>

#include <sys/shm.h>

#include <sys/sem.h>

#include <errno.h>

#define CLE 12
#define BUFFSZ 1024

typedef struct{

    int type;

    char text[BUFFSZ];

} Message;


int main()
{
    Message* monMess = (Message*)malloc(sizeof(Message));
    Message* monMessRecu = (Message*)malloc(sizeof(Message));
    int msgid;
    
    if((msgid = msgget((key_t)CLE, IPC_CREAT|0666))==(-1))

    {

        fprintf(stderr,"erreur creation file de message");

        return 0;

    }
    
    monMess->type = 2;
    strcpy(monMess->text,"MessageUn");
    
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {

        perror("Envoi de msg raté!");

        return 0;

    }
    
    monMess->type = 3;
    strcpy(monMess->text,"MessageDeux");
    
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {

        perror("Envoi de msg raté!");

        return 0;

    }
    
    monMess->type = 4;
    strcpy(monMess->text,"MessageQuatre");
    
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {

        perror("Envoi de msg raté!");

        return 0;

    }
    
    monMess->type = 5;
    strcpy(monMess->text,"MessageTrois");
    
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {

        perror("Envoi de msg raté!");

        return 0;

    }
    
    monMess->type = 3;
    strcpy(monMess->text,"MessageSix");
    
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {

        perror("Envoi de msg raté!");

        return 0;

    }
    
    monMess->type = 4;
    strcpy(monMess->text,"MessageCinq");
    
    if(msgsnd(msgid,monMess, BUFFSZ, 0) == -1) {

        perror("Envoi de msg raté!");

        return 0;

    }
    
    msgrcv(msgid, monMessRecu, BUFFSZ, 0, 0);
    
    printf("%s \n",monMessRecu->text);
    
    sleep(2);
    
    msgrcv(msgid, monMessRecu, BUFFSZ, 0, 0);
    
    printf("%s \n",monMessRecu->text);
    
    sleep(2);
    
    msgrcv(msgid, monMessRecu, BUFFSZ, 5, 0);
    
    printf("%s \n",monMessRecu->text);
    
    sleep(2);
    
    msgrcv(msgid, monMessRecu, BUFFSZ, 4, 0);
    
    printf("%s \n",monMessRecu->text);
    
    sleep(2);
    
    msgrcv(msgid, monMessRecu, BUFFSZ, 4, 0);
    
    printf("%s \n",monMessRecu->text);
    
    sleep(2);
    
    msgrcv(msgid, monMessRecu, BUFFSZ, 3, 0);
    
    printf("%s \n",monMessRecu->text);
    
    sleep(2);
    
    return 0;
}


(j'ai mis des sleeps pour avoir bien le temps de reflechir mdr)
Cependant, à l'execution, il ne m'affiche que deux lignes (les deux premieres).
Je m'explique pour être vraiment précis dans mes propos.
Je compile avec : gcc main.c -o play
Ensuite j'execute : ./play
il m'affiche :
messageUn
messageDeux
puis si je relance : ./play
il m'affiche :
messageQuatre
messageTrois
puis je relance une derniere fois et il m'affiche :
messageSix
messageTrois
Je sais qu'il ne me réaffiche pas messageUn et messageDeux parce que je ne détruit pas l'ipc avec ipcrm mais ma question est :[COLOR="Red"] pourquoi ne m'affiche t-il pas :
messageUn
messageDeux
messageTrois
messageQuatre
messageCinq
messageSix
???/COLOR

merci d'avance pour votre aide :?

edit : je viens de m'apercevoir qu'il ne marche qu'avec le nombre 0 pour les msgrcv. [COLOR="Red"]Donc que faut-il faire pour acceder a un message grace à son type ? Ma méthode n'est pas la bonne ?/COLOR Merci encore d'avance :ccool:


A voir également:

1 réponse

bon j'ai trouvé, il faut absolument que le troisieme parametre de msgrcv soit un long ;)
1