2012-10-09 35 views
10

キューメッセージが空であるかどうかを知りたいです。私は前と送信後に同じ結果を得る両方のケースでLinux:メッセージキューが空であることを確認してください。

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

struct msqid_ds buf; 
int num_messages; 

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

と私は、このPEEK機能を使用しました:私はそれが動作しない、次のようにmsg_ctlを()を使用していますメッセージをキューに送ります。

メッセージが正常にキューに到着すると、私は送信したものを読み取ってテストしました。

+0

"動作しません" - それは何をするためのものか?エラーメッセージが表示されますか?予期しない値を返しますか?どちらの価値? – sehe

+0

私は、0のメッセージの数を得ることを意味します –

+1

そして、最初のインスタンスではbuf.msg_qnumをチェックしていますか?原因不明の「int num_messages」もあるため、これは明確ではありません。 – Duck

答えて

1

私は正常に動作するようには思えないのサンプルコードを書いた:たぶん

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

あなたに参考になるもの?このコードを使用すると、キューのメッセージ数が正しく増加しているように見えます。

関連する問題