2017-05-17 11 views
0

Je fais cela depuis une journée entière et je n'ai pas compris. Je dois vérifier si un message vide est passé au destinataire ou au serveur, puis dissocier la file d'attente. C'est ce que j'ai:Comment vérifier si un message est vide

while((c=getopt(argc, argv, ":q:"))!=-1){ 
    switch(c){ 
     case 'q': 
      q = 1; 
      Q = optarg; 
      break; 
    } 
} 
int oprimek_vrsta = -1; 
char *msg = malloc(maxmsg_len + 1); 

if(q != 0){ 
    oprimek_vrsta = mq_open(Q, O_RDWR|O_CREAT|O_EXCL, 0660, &lastnosti_vrste); 
    if(oprimek_vrsta == -1){ 
     perror("error creating queue"); 
     return -1; 
    } 

    if(mq_getattr(oprimek_vrsta, &lastnosti_vrste) == -1){ 
     perror("error reading attributes"); 
     return -1; 
    } 
    while(loop){ 
     memset(msg, 0, 4096); 
     munmap(msg, 4096); 
     msg_len = mq_receive(oprimek_vrsta, msg, maxmsg_len, &priority); 
     if(msg_len == -1){ 
      perror("error reading message"); 
      loop = 0; 
      free(msg); 
      mq_close(oprimek_vrsta); 
      mq_unlink(Q); 
      return -1; 
     }else{ 
      write(1, msg, strlen(msg)); 
     } 
    } 
} 
+1

Ne vous 'msg_len == 0' si le message est vide? –

+0

Voulez-vous vérifier si la file d'attente est vide ou si le message reçu est vide? – alk

+0

je ne reçois pas 0, pour une raison quelconque, il est 1 mais si je mets 1, il se cassera même quand j'envoie quelque chose. @alk Je pense que les deux fonctionneraient – hypr2

Répondre

-1

De manuel mq_receive:

mq_receive() removes the oldest message with the highest priority 
from the message queue ... If the queue is empty, then, by default, 
mq_receive() blocks until a message becomes available, 
or the call is interrupted by a signal handler. 
If the O_NONBLOCK flag is enabled for the message 
queue description, then the call instead fails immediately with the error EAGAIN. 

RETURN VALUE: On success, mq_receive() and mq_timedreceive() return the 
number of bytes in the received message; on error, -1 is returned, 
with errno set to indicate the error. 

la valeur de retour de mq_receive est pas ce que vous cherchez. Vous devez vérifier si la longueur de votre message reçu est 0.

Je vous recommande vivement de lire le didacticiel this sur les files d'attente de messages POSIX.

Voici un exemple de travail:

#include <stdio.h> 
#include <mqueue.h> 
#include <stdlib.h> 
#include <string.h> /* memset */ 
#include <unistd.h> /* close */ 
#include <sys/mman.h> 

#define QUEUE_NAME "/test" 
#define MAX_MSG_LEN 100 

int main(int argc, char **argv) 
{ 
    int q; 
    char* Q; 
    char c; 
    int loop = 1; 
    int msg_len; 

    struct mq_attr lastnosti_vrste; 

    lastnosti_vrste.mq_flags = 0; 
    lastnosti_vrste.mq_maxmsg = 10; 
    lastnosti_vrste.mq_msgsize = 100; 
    lastnosti_vrste.mq_curmsgs = 0; 


    while((c=getopt(argc, argv, "q:")) != -1) 
    { 
     switch(c) 
     { 
      case 'q': 
       mq_unlink(Q); 
       q = 1; 
       Q = QUEUE_NAME; 
      break; 
     } 
    } 

    int oprimek_vrsta = -1; 
    char *msg = malloc(MAX_MSG_LEN + 1); 

    if(q != 0) 
    { 
     oprimek_vrsta = mq_open(Q, O_RDWR|O_CREAT|O_EXCL, 0660, &lastnosti_vrste); 
     if(oprimek_vrsta == -1){ 
      perror("error creating queue"); 
      return -1; 
     } 

     if(mq_getattr(oprimek_vrsta, &lastnosti_vrste) == -1){ 
      perror("error reading attributes"); 
      return -1; 
     } 
     while(loop) 
     { 

      memset(msg, 0, 4096); 
      munmap(msg, 4096); 
      msg_len = mq_timedreceive(oprimek_vrsta, msg, MAX_MSG_LEN, 0); 
      if(strlen(msg) == 0) 
      { 
       perror("error reading message"); 
       loop = 0; 
       mq_close(oprimek_vrsta); 
       mq_unlink(Q); 
       return -1; 
      } 
      else 
      { 
       write(1, msg, strlen(msg)); 
      } 
     } 

     free(msg); 
    } 

return 0; 
} 
+0

"* if (strlen (msg) == 0) ... *" donc si le premier 'char' des messages reçus est un '' \ 0 '', vous considérez cela comme une erreur. Pourquoi? Utiliser 'strlen()' sur le msg' ici suppose un cas d'utilisation très spécifique, à savoir qu'une "chaîne" a été reçue, ce qui n'est pas forcément le cas. – alk

+0

"* la valeur de retour de mq_receive n'est pas ce que vous cherchez *" pourquoi pas? Parce que comme vous l'avez cité dans la documentation: "* VALEUR RENVOYÉE: En cas de succès, mq_receive() et mq_timedreceive() renvoient le ** nombre d'octets dans le message reçu ***". '0' octets reçus indiquerait un message vide, n'est-ce pas? – alk

+0

Comment auriez-vous reçu un message vide? (-1) la valeur de retour ne fait clairement pas le travail – Vardit