11
votes

mq_receive: message trop long

Je suis en train de mettre en œuvre une communication entre 2 processus à l'aide d'une file d'attente. Le problème est que lorsque j'appelle la fonction MQ_Receive, je reçois cette erreur: Message trop long.

J'ai fait ce qui suit: xxx

si j'imprime la valeur de taille , Je reçois la taille = 1, tandis que lorsque j'imprime la même taille, mais d'un autre programme (obtenu par le même mécanisme), je reçois quelque chose d'entier non long (-1217186280) ...

Comment puis-je résoudre Cette erreur? .... Alors, alors que Taille = 1, je crois qu'il est juste de dire "message trop long" mais pourquoi 1?

P.s. J'ai également essayé de mettre: xxx

mais sans résultat.


2 commentaires

Appelez-vous MQ_GETATTR () là-bas quelque part pour obtenir la taille réelle? Sinon, vous référez-vous à la mémoire de la décroche de la structure.


Postez le code où vous créez la file d'attente et essayez de le lire.


4 Réponses :


9
votes

Lors du débogage des files d'attente de Posix en temps réel, vous devriez commencer par un exemple de programme qui fonctionne et partez de là. Une fois que vous avez le programme d'échantillon en cours d'exécution, il devrait être simple de veiller à ce que votre propre code suit toutes les étapes.

Le programme suivant a été testé avec succès sous Ubuntu 11.04: P>

Bringing up server.
   Server opened mqd_t of 3.
Client sending.
   Client opened mqd_t of 4.
Server receiving on mqd_t 3.
   Received [Hello there!].
Bringing down server with mqd_t 3.


1 commentaires

+1 pour le programme complet et `rc = mq_unlink (mqname);` avant l'ouverture! OS peut se souvenir de l'ancien mq_msgsize . Il suffit d'ouvrir la file d'attente avec le nouveau mq_msgsize ne suffit pas.



22
votes

On dirait que vous devez lire plus attentivement les docs. Lorsque vous appelez mq_receive code>, vous devez passer la taille du tampon de destination. Cette taille doit être supérieure à l'attribut MQ_MSGSIZE de la file d'attente forte>. De plus, il semble que vous ayez une erreur dans l'initialisation des attributs de file d'attente qui rend le bon mq_receive code> appel d'appel impossible. Voici la session de file d'attente de messagerie standard:

  1. remplir mq_attr code> struct ( doc ): p> XXX PRE> LI>

  2. Créez la file d'attente avec MQ_OPEN code> dans le processus de maître ( doc ): p> XXX PRE> LI>

  3. dans la file d'attente ouverte du processus d'écrivain pour l'écriture: p>

    char rcvmsg[50];
    int iret = mq_receive(queue, rcvmsg, 50, NULL);
    


0 commentaires

8
votes

N'oubliez pas de dissuader la file d'attente du message avant d'exécuter votre programme à nouveau. Si vous ne direz pas de ça, cela utilisera toujours les anciens paramètres de la file d'attente de messages. Cela se produit lorsque vous terminez votre programme avec CTRL + C. Je pense que c'est une bonne idée de mettre le code suivant au début du programme:

int rc = mq_unlink(name.c_str());
if (rc != 0 && errno != ENOENT)
      THROW_ERRNO_EXCEPTION();  

// ENOENT is the status code if the queue doesn't exist, which is not an error
// if you are immediately going to create it.


0 commentaires

0
votes

juste une correction ci-dessus ... "Cette taille doit être égale ou supérieure que l'attribut mq_msgsize de la file d'attente"

La taille égale est probablement requise si vous passez une structure au lieu d'un tampon: Voir: Envoyer la structure dans MQ_SEND


0 commentaires