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 :

File de messages POSIX


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut File de messages POSIX
    Bonjour,

    J'éssai désespérément de créer un file de messages. Bon la créer ce n'est pas le problème, sauf que j'ai l'impression qu'elle ne reçoit aucun message.. D'ailleurs je specifie un nombre max de messages pourtant je peux lui en envoyer plus..Idem avec la taille d'un message. il me semblait que ca devait provoquer une erreur non ?

    Je laisse le code au cas ou quelqu'un est assez familier avec ca

    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
     
    #include <unistd.h>
    #include <mqueue.h>
    #include <stdio.h>
    #include <signal.h>
    #include <string.h>
    #include <sys/types.h>
    #include <stdlib.h>
     
    int main(int argc, char ** argv){
    	int i=0;
    	mqd_t mq;
     
    	struct mq_attr attr;
    	struct mq_attr live_attr;
    	//struct sigaction sa;
     
    	attr.mq_maxmsg = 5;
    	attr.mq_msgsize = 30;
    	attr.mq_flags = 0;
    	attr.mq_curmsgs = 0;
     
    	char buff[100];
    	strcpy(buff, "TRANX");
    	int msgsize = 100;
     
     
     
    	if (mq = mq_open("/queue", O_CREAT | O_RDWR | O_EXCL, 0666, attr) == -1){
    		perror("Error : message queue ");
    		mq_unlink("/queue");
    		exit(1);
    	}
     
     
    	while(i!=10){
    		mq_send(mq, buff, msgsize, 1);
    		mq_getattr(mq, &attr);
    		printf("nbre msg : %d\n",attr.mq_curmsgs);
    		printf("max msg : %d\n",attr.mq_maxmsg);
    		printf("%d \n",i);
    		i++;
    	}
    	mq_unlink("/queue");
    }

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Qu'est ce que entend par erreur ?

    Tu ne vérifie même pas si mq_send et mq_get_attr renvoi un code d'erreur !
    Donc surement que si car msgsize utilisé dans mq_send >>> à msgsize utilisé dans mq_open

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut
    ah exact, j'ai donc fait la modif et l'erreur générée par le mq_send est 'Bad file descriptor' pourtant le mq_open ne me renvoie pas d'erreur ..

  4. #4
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par DrTank
    Bonjour,

    J'éssai désespérément de créer un file de messages. Bon la créer ce n'est pas le problème, sauf que j'ai l'impression qu'elle ne reçoit aucun message.. D'ailleurs je specifie un nombre max de messages pourtant je peux lui en envoyer plus..Idem avec la taille d'un message. il me semblait que ca devait provoquer une erreur non ?

    Je laisse le code au cas ou quelqu'un est assez familier avec ca
    Citation Envoyé par DrTank
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	char buff[100];
    	strcpy(buff, "TRANX");
    	int msgsize = 100;
    msgsize ne sert à rien, sizeof(buff)/sizeof(*buff) serait plus propre au cas où tu déciderais de changer de taille de buffer.


    Citation Envoyé par DrTank
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	if (mq = mq_open("/queue", O_CREAT | O_RDWR | O_EXCL, 0666, attr) == -1){
    Belle, belle !! Faut arrêter de programmer trop tar le soir, la bad file descriptor est potentiellement justifié ici. Il ne manque pas des parenthèses ?

    Tu affectes à mq le résultat de la comparason entre le retour de mq_open et -1 et non le retour de mq_open.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( (mq = mq_open("/queue", O_CREAT | O_RDWR | O_EXCL, 0666, attr)) == (mqd_t)-1)
    Et voilà, tu dois bien avoir un bad file descriptor et il ne te reste plus qu'à scruter errno pour voir pourquoi.

    A+

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut
    Ahhh bien vu c'était effictivement ca... tout fonctionne maintenant, merci


    edit : En revanche quand je fais un printf de attr.mq_maxmsg il m'affiche 10 alors que ce n'est pas ce que je lui ai spécifié. Meme apres un mq_setattr avec une valeur differente il m'affiche 10, c'est à n'y rien comprendre..

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut
    up

  7. #7
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Merci de cliquer sur le bouton quand on à trouvé la solution.

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut
    bah oui mais il reste un petit probleme que je n'arrive pas a résoudre..

  9. #9
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Il peut y avoir plusieurs explications à cela.

    Déjà tout dépend à quel moment exactement tu fais ton printf ?
    Avant ou aprés l'open, dans ta boucle while comme dans ton premier exemple de code ...

    De toutes les façons, il ne faut pas juste faire un printf, il faut juste avant utiliser la fonction mp_getattr pour remplir la structure.
    Je te conseilles de mettre un printf juste avant l'appel à l'open, un juste aprés l'open. Et enfin un autre dans la boucle while, comme ça tu pourras savoir à quel moment on passe de 5 à 10.

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut
    Exact, avant le mq_open ca me met la bonne valeur, mais pas apres..

    Mon prof m'avait dit qu'il fallait rajouter un & avant le attr dans le mq_open, chose que j'avais deja essayé, mais l'erreur retournée est alors "Error : message queue : Invalid argument"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((mq = mq_open(MQ , O_CREAT | O_RDWR, 666, attr)) == -1){

  11. #11
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Bon je suis pas vraiment sur de ce que je vais dire (car je connais pas trés bien les mq, et la page de man n'est pas d'un grand secours).

    Essaye quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... mq_open(... , (void*) &attr) ...
    Si ton programme marche sans erreurs (mq_maxmsg à la bonne valeur) c'est que tout est ok.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Un cast explicite d'une adresse en void* ne fait rien...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut
    Alors en fait il fallait specifier une nombre de messages max inferieur a 10.
    Et il fallait bien mettre un &.

    merci pour votre aide

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

Discussions similaires

  1. File de message posix
    Par lalon dans le forum C
    Réponses: 2
    Dernier message: 02/01/2013, 23h07
  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