2012-10-09 34 views
10

Quiero saber si un mensaje de cola está vacío o no. he utilizado msg_ctl() de la siguiente no funciona:Linux: compruebe si la cola de mensajes está vacía

struct msqid_ds buf; 
int num_messages; 

rc = msgctl(msqid, IPC_STAT, &buf); 

y he utilizado esta función vistazo:

int peek_message(int qid, long type) 
{ 
    int result, length; 
    if((result = msgrcv(qid, NULL, 0, type, IPC_NOWAIT)) == -1) { 
     if(errno==E2BIG) 
      return(1); 
    } 

    return(0); 
} 

en ambos casos me sale el mismo resultado antes y después de enviar una mensaje a la cola.

el mensaje llega a la cola con éxito, lo he probado al leer lo que he enviado.

+0

"no funciona"? - ¿Qué hace? ¿Recibes un mensaje de error? ¿Devuelve un valor inesperado? ¿Qué valor? – sehe

+0

quiero decir, obtengo un recuento de 0 mensajes –

+1

y en la primera instancia está revisando buf.msg_qnum? Eso no está claro ya que también tiene un "int num_messages" inexplicado. – Duck

Respuesta

1

que escribió el código de ejemplo que no parece funcionar correctamente:

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <stdio.h> 
#include <errno.h> 

struct msgbuf { 
    long mtype;  /* message type, must be > 0 */ 
    char mtext[1]; /* message data */ 
}; 

int main(void) { 
    int msqid; 
    //msqid = msgget(IPC_PRIVATE, (IPC_CREAT | IPC_EXCL | 0600)); 
    msqid = msgget((key_t)1235, 0600 | IPC_CREAT); 

    printf("Using message queue %d\n", msqid); 
    struct msqid_ds buf; 

    int rc = msgctl(msqid, IPC_STAT, &buf); 

    uint msg = (uint)(buf.msg_qnum); 
    printf("# messages before post: %u\n", msg); 

    printf("Posting message to queue...\n"); 
    struct msgbuf qmsg; 
    qmsg.mtype = 100; 
    qmsg.mtext[0] = 'T'; 

    int res = msgsnd(msqid, &qmsg, 1, MSG_NOERROR); 

    rc = msgctl(msqid, IPC_STAT, &buf); 

    msg = (uint)(buf.msg_qnum); 
    printf("# messages after post: %u\n", msg); 

    return 0; 
} 

Tal vez será útil para usted? La cantidad de mensajes en la cola parece incrementarse correctamente cuando se utiliza este código.