2012-10-09 19 views
10

Ich möchte wissen, ob eine Warteschlangennachricht leer ist oder nicht. Ich habe msg_ctl() wie folgt verwendet es nicht funktioniert:Linux: Überprüfen Sie, ob die Nachrichtenwarteschlange leer ist

struct msqid_ds buf; 
int num_messages; 

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

und ich habe diese Peek-Funktion verwendet:

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); 
} 

in beiden Fällen i das gleiche Ergebnis vor und nach einem Senden Nachricht an die Warteschlange.

Die Nachricht wird erfolgreich in die Warteschlange gestellt, ich habe das getestet, indem ich gelesen habe, was ich gesendet habe.

+0

"es funktioniert nicht"? - was tut es? Erhalten Sie eine Fehlermeldung? Gibt es einen unerwarteten Wert zurück? Welcher Wert? – sehe

+0

ich meine, ich bekomme eine Zählung von 0 Nachrichten –

+1

Und in erster Linie überprüfen Sie buf.msg_qnum? Das ist nicht klar, da Sie auch eine unerklärliche "int num_messages" haben. – Duck

Antwort

1

Ich schrieb den Beispielcode, richtig zu funktionieren scheint:

#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; 
} 

Vielleicht, die Ihnen nützlich sein? Die Anzahl der Nachrichten in der Warteschlange scheint bei Verwendung dieses Codes korrekt zu erhöhen.